Rumah >pembangunan bahagian belakang >Golang >Bagaimana Mengendalikan Medan Dikongsi dalam Struktur Berbeza dengan Generik dalam Go?

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

Linda Hamilton
Linda Hamiltonasal
2024-10-29 04:51:021023semak imbas

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>

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>

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>

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>

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!

Kenyataan:
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