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
DDDasal
2024-10-27 10:20:031037semak imbas

 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
}

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:

  • 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!

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