首頁 >後端開發 >Golang >如何在 Go 中取得實作介面的正確的原始類型的reflect.Kind?

如何在 Go 中取得實作介面的正確的原始類型的reflect.Kind?

Patricia Arquette
Patricia Arquette原創
2024-12-17 04:58:24322瀏覽

How to Get the Correct reflect.Kind of a Primitive Type Implementing an Interface in Go?

擷取基於原始類型的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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn