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.
Untuk menangani isu ini, beberapa penyelesaian adalah dicadangkan:
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>
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>
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>
Adalah penting untuk ambil perhatian bahawa penyelesaian ini mempunyai hadnya:
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!