Rumah > pembangunan bahagian belakang > Golang > Bolehkah Fungsi Generik Mengubah Suai Medan Dikongsi dalam Struktur Tidak Berkaitan Merentas Pakej?

Bolehkah Fungsi Generik Mengubah Suai Medan Dikongsi dalam Struktur Tidak Berkaitan Merentas Pakej?

DDD
Lepaskan: 2024-10-27 10:20:03
asal
1040 orang telah melayarinya

 Can Generic Functions Modify Shared Fields in Unrelated Structs Across Packages?

Bolehkah Fungsi Generik Berfungsi dengan Ahli Kongsi Merentasi Struktur Pakej Luaran?

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

Nota:

  • Penyelesaian 2 menyediakan paling fleksibel dan membenarkan jenis keselamatan.
  • Penyelesaian 3 ialah pendekatan yang lebih generik tetapi memerlukan refleksi dan mungkin menimbulkan overhed prestasi.

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan