確定Go 中派生介面類型的種類
在Go 中處理反射的複雜性可能具有挑戰性,尤其是在處理派生接口時接口和原始類型。在本文中,我們將探討如何確定實作介面但具有底層基元實作的類型的reflect.Kind。
問題來自以下程式碼片段:
type ID interface { myid() } type id string func (id) myid() {} func main() { id := ID(id("test")) fmt.Println(id) fmt.Println(reflect.TypeOf(id)) // How to get the kind to return "reflect.Interface" from the var "id"? fmt.Println(reflect.TypeOf(id).Kind()) }
在這個場景中,我們有一個名為 ID 的介面和一個名為 id 的字串型別。然而,id類型的實作採用id字串類型。目標是從id變數中檢索reflect.Kind作為reflect.Interface。
解決方案
解決這個問題的關鍵在於理解反射如何處理介面價值。當將值傳遞給reflect.TypeOf()時,它會自動包裝在interface{}中。然而,為了保存類型信息,必須使用指向介面的指針。
透過定義一個指向 ID 介面的指標並將其傳遞給reflect.TypeOf(),我們可以使用 Elem( ) 來存取介面類型的實際類型描述符。
程式碼範例
以下程式碼片段示範了解決方案:
id := ID(id("test")) fmt.Println(id) t := reflect.TypeOf(&id).Elem() fmt.Println(t) fmt.Println(t.Kind())
此程式碼將輸出:
test main.ID interface透過利用此技術,我們可以準確地確定派生介面類型的reflect.Kind並揭示其底層實作細節。
以上是Go 中如何確定派生介面類型的「reflect.Kind」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!