Bagaimana Mengendalikan Medan Dikongsi dalam Struktur Berbeza dengan Generik dalam Go?

Linda Hamilton
Lepaskan: 2024-10-29 04:51:02
asal
951 orang telah melayarinya

How to Handle Shared Fields in Different Structs with Generics in Go?

Mengendalikan Medan Dikongsi dalam Struktur Berbeza dengan Generik

Apabila bekerja dengan pakej luaran, ia boleh menjadi mencabar untuk menentukan fungsi generik yang beroperasi pada struct yang mengandungi ahli biasa. Artikel ini meneroka masalah di mana percubaan telah dibuat untuk mencipta fungsi generik untuk mengubah suai medan kongsi dua struct mesej Firebase yang berbeza, Mesej dan MulticastMessage.

Walaupun mempunyai medan konfigurasi Android yang serupa, struct ini tidak mempunyai hubungan yang jelas dan percubaan untuk mengakses sifat biasa mereka secara langsung menggunakan parameter jenis mengakibatkan ralat. Sebab untuk ini ialah Go 1.18 belum lagi menyokong mengakses medan biasa atau kaedah parameter jenis, seperti yang dijelaskan dalam urutan yang dipautkan.

Pilihan Penyelesaian

Untuk menangani isu ini, beberapa penyelesaian adalah dicadangkan:

1. Suis Taip

Jika bilangan jenis yang terlibat adalah terhad, pernyataan suis jenis boleh digunakan untuk mengakses medan kongsi:

<code class="go">func highPriority[T firebaseMessage](message T) T {
    switch m := any(message).(type) {
    case *messaging.Message:
        setConfig(m.Android)
    case *messaging.MulticastMessage:
        setConfig(m.Android)
    }
    return message
}</code>
Salin selepas log masuk

2. Pembungkus dengan Kaedah

Kaedah ini melibatkan mencipta struct pembungkus dengan kaedah tambahan yang anda mahu gunakan dalam fungsi generik:

<code class="go">type MessageWrapper struct {
    messaging.Message
}

func (w *MessageWrapper) SetConfig(cfg messaging.Android) {
    *w.Android = cfg
}</code>
Salin selepas log masuk

Fungsi generik kemudiannya boleh mengakses kaedah biasa ini:

<code class="go">func highPriority[T wrappedMessage](message T) T {
    message.SetConfig(messaging.Android{"some-value"})
    return message
}</code>
Salin selepas log masuk

3. Refleksi

Jika bilangan struct adalah besar, refleksi boleh digunakan untuk mengakses medan kongsi secara dinamik:

<code class="go">func highPriority[T firebaseMessage](message T) T {
    cfg := &messaging.Android{}
    reflect.ValueOf(message).Elem().FieldByName("Android").Set(reflect.ValueOf(cfg))
    return message
}</code>
Salin selepas log masuk

Nota

Adalah penting untuk ambil perhatian bahawa penyelesaian ini mempunyai hadnya:

  • Kaedah suis jenis dan pembalut kurang sesuai untuk sejumlah besar jenis.
  • Refleksi memerlukan struct dan medan yang boleh dialamatkan.

Atas ialah kandungan terperinci Bagaimana Mengendalikan Medan Dikongsi dalam Struktur Berbeza dengan Generik dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
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!