擷取基於原始類型的reflect.Kind類型
在Go中,您可以使用reflect套件檢查結構類型和值。然而,確定實作介面但基於原始類型的類型的reflect.Kind可能具有挑戰性。
考慮以下範例:
type ID interface { myid() } type id string func (id) myid() {}
這裡,id類型實作了ID接口,但是它的實作是基於原始型別string的。當您嘗試使用reflect.TypeOf(id).Kind()取得id的reflect.Kind時,它將傳回reflect.String而不是reflect.Interface。
要解決此問題,您需要透過指向介面值而不是值本身的指標。原因是reflect.TypeOf()需要介面值,但如果傳遞非介面值,它將隱式包裝在interface{}中。
下面是一個範例:
id := ID(id("test")) fmt.Println(id) t := reflect.TypeOf(&id).Elem() fmt.Println(t) fmt.Println(t.Kind())
輸出為:
test main.ID interface
在這種情況下,reflect.TypeOf(&id) 傳回一個指向介面值的指針,然後使用t :=reflect.TypeOf(&id).Elem()「展開」。得到的t是ID介面的類型描述符,其Kind()方法傳回reflect.Interface。
呼叫時可以使用此方法取得任何傳回reflect.Interfaces的類型的reflect.Kind Kind(),即使它是基於原始類型。
以上是如何在 Go 中取得實作介面的正確的原始類型的reflect.Kind?的詳細內容。更多資訊請關注PHP中文網其他相關文章!