Fungsi Generik untuk Ahli Struktur daripada Pakej Luaran
Pertimbangkan matlamat untuk mencipta satu fungsi untuk menambah medan tertentu pada struct mesej Firebase yang berbeza, seperti Message dan MulticastMessage, yang berkongsi medan biasa jenis yang serupa. Pada mulanya, percubaan untuk mentakrifkan fungsi generik highPriority menggunakan kekangan jenis seperti berikut menghasilkan ralat:
<code class="go">type firebaseMessage interface { *messaging.Message | *messaging.MulticastMessage } func highPriority[T firebaseMessage](message T) T { message.Android = &messaging.AndroidConfig{...} return message }</code>
Limitation of Go 1.18
In Go 1.18, mengakses medan biasa atau kaedah parameter jenis tidak disokong. Oleh itu, pendekatan ini gagal.
Penyelesaian 1: Suis Taip
Untuk bilangan jenis yang terhad dalam kesatuan, suis jenis boleh digunakan:
<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>
Penyelesaian 2: Pembungkus dengan Kaedah
Pendekatan lain melibatkan penentuan jenis pembungkus yang melaksanakan kaedah biasa untuk menetapkan konfigurasi yang diingini:
<code class="go">type wrappedMessage interface { *MessageWrapper | *MultiCastMessageWrapper SetConfig(c foo.Config) } // ... func highPriority[T wrappedMessage](message T) T { message.SetConfig(messaging.Android{"some-value"}) return message }</code>
Penyelesaian 3: Refleksi
Untuk senario dengan banyak struct, refleksi boleh digunakan:
<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 Tambahan:
Atas ialah kandungan terperinci Berikut ialah beberapa pilihan tajuk, masing-masing menyerlahkan aspek artikel yang berbeza: Memberi tumpuan kepada masalah: * Bagaimana untuk Menetapkan Medan dalam Struktur Mesej Firebase Berbeza dengan Generik dalam Go 1.18? * Gen. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!