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

WBOY
Lepaskan: 2024-02-10 10:39:07
ke hadapan
884 orang telah melayarinya

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)
}
Salin selepas log masuk

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)

}
Salin selepas log masuk

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
}

Salin selepas log masuk

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)
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!