Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Golang: Akses medan pada "mana-mana" jenis generik

Golang: Akses medan pada "mana-mana" jenis generik

WBOY
WBOYke hadapan
2024-02-10 10:39:07882semak imbas

Golang: Akses medan pada mana-mana jenis generik

Golang ialah bahasa pengaturcaraan bertaip statik yang sentiasa menarik perhatian ramai dalam proses melaksanakan generik. Baru-baru ini, pasukan Golang telah membuat satu kejayaan besar dalam reka bentuk generik, membolehkan pembangun mengakses medan pada "sebarang" jenis generik. Ciri baharu ini membawa fleksibiliti dan skalabiliti yang lebih besar kepada Golang. Seterusnya, kami akan membenarkan editor PHP Xigua memperkenalkan kepada anda secara terperinci kaedah dan senario aplikasi untuk mengakses medan pada jenis generik "sebarang" di Golang.

Kandungan soalan

Saya menggunakan fungsi pihak ketiga yang jenis generiknya ialah any. Fungsi ini mengembalikan objek jenis yang dihantar kepadanya, dan kod saya sendiri berfungsi melawan pulangan itu.

Saya cuba menulis fungsi generik saya sendiri yang menerima medan HasID 类型的泛型,然后将其传递给第三方函数。但是,当我尝试访问第三方函数返回值的 ID, dan saya mendapat ralat.

Apakah yang perlu saya lakukan untuk memasukkan ini dengan betul?

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)
}

Penyelesaian

Saya bersetuju dengan ulasan @mkopriva, tetapi saya fikir ini mungkin kerana anda "tidak boleh" mentakrifkan medan pada kekangan, jadi anda tidak boleh mengakses medan tersebut dalam parameter jenis.

(Mungkin tidak berubah dalam Go 1.19, haha)

Untuk memastikan perkara mudah, cuma lakukan seperti yang anda lakukan:

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

Tetapi jika anda mentakrifkannya sebagai antara muka, anda akan mempunyai akses kepada kaedahnya:

type HasID interface {
    ID() string
}

func MyFunc[U HasID](hasID U) {
    fmt.Println(hasID.ID()) // compiles V
}

https://www.php.cn/link/46dfb1fd21d4e16401260f54d2b6a88a

Untuk mengendalikan struktur, anda perlu melakukan beberapa penukaran jenis:

type HasID struct {
    ID string `json:"id"`
}

func MyFunc[U HasID](hasID U) {
    thingWithID := HasID(hasID)
    fmt.Println(thingWithID.ID)
}

P.S - Ada isu terbuka mulai 02/2022 - https://github .com/golang/go/issues/51259

P.S - Oh, saya baru tahu... - Bagaimana untuk mengakses medan struct (jenis T tidak mempunyai medan atau kaedah) menggunakan generik?

Atas ialah kandungan terperinci Golang: Akses medan pada "mana-mana" jenis generik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam