Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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

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

Linda Hamilton
Linda Hamiltonasal
2024-10-27 20:32:01720semak imbas

Here are a few title options, each highlighting a different aspect of the article:

Focusing on the problem:

* How to Set Fields in Different Firebase Message Structs with Generics in Go 1.18?
* Generic Function for Struct Members from External Packages:

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 = &amp;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 := &amp;messaging.Android{}
    reflect.ValueOf(message).Elem().FieldByName("Android").Set(reflect.ValueOf(cfg))
    return message
}</code>

Nota Tambahan:

  • Untuk mendapatkan maklumat lanjut tentang pengehadan parameter jenis, rujuk [Bagaimana saya boleh menentukan medan struct dalam antara muka saya sebagai kekangan jenis?](https://go.dev/play/p/9iG0eSep6Qo).
  • Untuk butiran tentang melaksanakan kaedah biasa bagi jenis dalam kekangan kesatuan, lawati [In Go generik, bagaimana menggunakan kaedah biasa untuk jenis dalam kekangan kesatuan?](https://go.dev/play/p/JUHp9Fu27Yt ).

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!

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