處理回覆物件或介面時,可能需要辨識可用欄位。雖然反射是一種選擇,但需要事先了解欄位名稱。本文探討如何使用反射來取得可從介面存取的所有欄位。
要取得類型描述符,請使用reflect.TypeOf() 函數。此描述符可用於列出介面中儲存的動態值的欄位。
考慮以下範例:
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}
每種類型.Field() 呼叫傳回一個reflect.StructField,其中包含欄位名稱等詳細資訊.
要取得欄位值,請使用reflect.ValueOf() 取得reflect.Value。然後,您可以使用Value.Field() 或Value.FieldByName():
v := reflect.ValueOf(reply) for i := 0; i < v.NumField(); i++ { fmt.Println(v.Field(i)) }
輸出:
1 2
通常,指向結構封裝在介面中。要導航到指向的類型或值,請使用Type.Elem() 和Value.Elem():
t := reflect.TypeOf(reply).Elem() v := reflect.ValueOf(reply).Elem()
透過使用反射,您可以從介面檢索所有字段,無論它們是否明確已知。這提供了一種檢查任意資料結構的強大方法。有關 Go 反射的更多資訊可以在部落格文章「反射定律」中找到。
以上是如何使用 Go 反射從介面檢索欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!