首頁  >  文章  >  後端開發  >  Golang:存取「any」類型泛型上的字段

Golang:存取「any」類型泛型上的字段

WBOY
WBOY轉載
2024-02-10 10:39:07918瀏覽

Golang:存取「any」類型泛型上的字段

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除