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 沒有字段或方法)?






