Masalah:
Matlamatnya adalah untuk menentukan fungsi generik yang boleh mengubah suai medan tertentu merentas pelbagai struktur mesej Firebase. Walaupun mempunyai medan bertindih jenis yang serupa, struct Message dan MulticastMessage tidak mempunyai hubungan yang jelas. Walau bagaimanapun, cubaan menggunakan kekangan antara muka untuk mengendalikan perkara ini menimbulkan ralat.
Penyelesaian 1: Suis Taip
Jika bilangan jenis dalam kesatuan adalah kecil, a pendekatan suis jenis boleh berfungsi. Ini melibatkan pengendalian secara manual setiap jenis dan memanggil kaedah yang sesuai untuk menetapkan nilai medan yang diingini.
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 }
Penyelesaian 2: Pembungkus dengan Kaedah
Penyelesaian alternatif melibatkan pembalut struktur asal dan mentakrifkan kaedah biasa dalam pembungkus yang boleh digunakan untuk menetapkan medan kongsi.
type wrappedMessage interface { *MessageWrapper | *MultiCastMessageWrapper SetConfig(c foo.Config) } type MessageWrapper struct { messaging.Message } func (w *MessageWrapper) SetConfig(cfg messaging.Android) { *w.Android = cfg }
Penyelesaian 3: Refleksi
Untuk mengendalikan yang lebih besar bilangan struct, refleksi boleh digunakan untuk menetapkan medan yang dikongsi secara dinamik. Walau bagaimanapun, ambil perhatian bahawa ini memerlukan struct dan medan boleh ditangani.
func highPriority[T firebaseMessage](message T) T { cfg := &messaging.Android{} reflect.ValueOf(message).Elem().FieldByName("Android").Set(reflect.ValueOf(cfg)) return message }
Nota:
Atas ialah kandungan terperinci Bolehkah Fungsi Generik Mengubah Suai Medan Dikongsi dalam Struktur Tidak Berkaitan Merentas Pakej?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!