Golang是一種靜態類型的編程語言,它在實現泛型的過程中一直備受關注。最近,Golang團隊在設計泛型的方案上取得了重大突破,使得開發者能夠訪問“any”類型泛型上的字段。這個新特性為Golang帶來了更強大的靈活性和擴展性。接下來,我們將由php小編西瓜為您詳細介紹Golang上訪問“any”類型泛型上字段的方法與應用場景。
問題內容
我正在使用第三方函數,其泛型類型為 any
。該函數返回一個傳遞給它的類型的對象,而我自己的代碼則針對該返回的東西起作用。
我正在嘗試編寫自己的泛型函數,該函數接受 HasID
類型的泛型,然后將其傳遞給第三方函數。但是,當我嘗試訪問第三方函數返回值的 ID
字段時,出現錯誤。
我需要做什么才能正確輸入此內容?
type HasID struct { ID string `json:"id"` } func ThirdPartyFunc[T any]() T { // do some stuff return someThing // of type T } func MyFunc[U HasID]() { thingWithID := ThirdPartyFunc[U]() fmt.Println(thingWithID.ID) // undefined (type U has no field or method ID) }
登錄后復制
解決方法
我同意 @mkopriva 的評論,但我認為這可能是因為您“無法”在約束上定義字段,因此您無法在類型參數中訪問這些字段。
(Go 1.19 中可能沒有改變,哈哈)
為了簡單起見,就像你會做的那樣:
type HasID struct { ID string `json:"id"` } func MyFunc[U HasID](hasID U) { fmt.Println(hasID.ID) // hasID.ID undefined (type U has no field or method ID) }
登錄后復制
https://www.php.cn/link/bddcda5d65fcfdec9de3838794a77265
但是如果您將其定義為接口,您將可以訪問其方法:
type HasID interface { ID() string } func MyFunc[U HasID](hasID U) { fmt.Println(hasID.ID()) // compiles V }
登錄后復制
https://www.php.cn/link/46dfb1fd21d4e16401260f54d2b6a88a
為了處理結構,您需要進行一些類型轉換:
type HasID struct { ID string `json:"id"` } func MyFunc[U HasID](hasID U) { thingWithID := HasID(hasID) fmt.Println(thingWithID.ID) }
登錄后復制
P.S – 從 02/2022 開始有一個未解決的問題 – https://github .com/golang/go/issues/51259
P.S – 哦,我剛剛發現… – 如何使用泛型訪問結構體字段(類型 T 沒有字段或方法)?