透過反射發現介面中的欄位可存取性
介面的動態特性提出如何決定回覆物件中可存取欄位的問題。雖然反射提供了一種解決方案,但它需要預先了解欄位名稱。本文探討如何透過深思熟慮地應用反射技術來檢索所有可用欄位。
隨著 reflect.TypeOf() 的引入,一條獲取 reflect 的路徑打開了。輸入 描述符。此描述符支援枚舉與介面中保存的動態值關聯的欄位。
考慮以下範例:
type Point struct { X int Y int } var reply interface{} = Point{1, 2} t := reflect.TypeOf(reply) for i := 0; i < t.NumField(); i++ { fmt.Printf("%+v\n", t.Field(i)) }
此程式碼片段產生的輸出說明了欄位的成功擷取資訊:
{Name:X PkgPath: Type:int Tag: Offset:0 Index:[0] Anonymous:false} {Name:Y PkgPath: Type:int Tag: Offset:4 Index:[1] Anonymous:false}
每個欄位都由 reflect.StructField 描述struct,提供欄位名稱等詳細資訊。
要取得欄位值,可以使用 reflect.ValueOf() 來取得 reflect.Value。此值允許透過Field() 或FieldByName() 方法存取欄位:
v := reflect.ValueOf(reply) for i := 0; i < v.NumField(); i++ { fmt.Println(v.Field(i)) }
這將產生以下輸出:
1 2
注意:在指向結構體的指標被包裝在介面中的場景中, Type.Elem() 和 Value.Elem()
可以用來導航到底層類型或值。最後,考慮到存在的情況指標的類型是不確定的,Type.Kind() 和Value.Kind() 可以用於與reflect.Ptr
進行比較。 有關 Go 中反射的綜合指南,請參閱部落格文章「反射定律」。以上是如何使用反射來發現 Go 介面中的可存取欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!