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 沒有欄位或方法)?
以上是Golang:存取「any」類型泛型上的字段的詳細內容。更多資訊請關注PHP中文網其他相關文章!