Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Menggabungkan Dua Struktur Go yang Sama Jenis dengan Cekap?

Bagaimanakah Saya Boleh Menggabungkan Dua Struktur Go yang Sama Jenis dengan Cekap?

Linda Hamilton
Lepaskan: 2024-12-21 13:56:09
asal
857 orang telah melayarinya

How Can I Efficiently Merge Two Go Structs of the Same Type?

Menggabungkan Struktur Jenis Sama dengan Refleksi atau JSON Unmarshalling

Dalam Go, anda mungkin menghadapi senario di mana anda perlu menggabungkan dua struct daripada jenis yang sama, dengan nilai daripada satu struct berpotensi mengatasi yang lain. Artikel ini meneroka dua pendekatan untuk mencapai perkara ini: menggunakan keupayaan pantulan Go atau unmarshalling data JSON ke dalam konfigurasi lalai yang disediakan.

Pendekatan Refleksi (Tidak Disyorkan)

Pendekatan refleksi , seperti yang dibentangkan di bawah, memerlukan penyemakan nilai sifar untuk menentukan medan yang hendak ditindih. Walau bagaimanapun, penyelesaian ini tidak sesuai kerana:

<br>func merge(default <em>Config, file </em>Config) (*Config) {<br> b := reflect. ValueOf(default).Elem()<br> o := reflect.ValueOf(file).Elem()</p>
<p>for i := 0; i < b.NumField(); i {</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">defaultField := b.Field(i)
fileField := o.Field(i)
if defaultField.Interface() != reflect.Zero(fileField.Type()).Interface() {
 defaultField.Set(reflect.ValueOf(fileField.Interface()))
}
Salin selepas log masuk

}

kembali lalai
}

  • Ia bergantung pada pantulan, yang boleh menjadi tidak cekap dan mudah ralat.
  • Ia menganggap bahawa nilai sifar sentiasa ditetapkan dalam konfigurasi lalai, yang mungkin tidak benar dalam semua kes.
  • Ia tidak mengambil kira penggantian eksplisit kepada nilai sifar dalam konfigurasi fail.

JSON Unmarshalling Approach (Disyorkan)

Pendekatan yang lebih elegan dan fleksibel adalah dengan menggunakan pengekodan/pakej json Go dan JSON yang tidak ditugaskan data ke dalam konfigurasi lalai yang disediakan. Kaedah ini memberikan beberapa kelebihan:

  • Mengendalikan nilai yang hilang dengan anggun: Nilai yang tiada dalam konfigurasi fail akan diisi dengan nilai lalai.
  • Mengatasi nilai lalai: Nilai yang disediakan dalam konfigurasi fail akan mengatasi nilai lalai, tanpa mengira nilainya taip.
  • Menyokong penggantian eksplisit kepada nilai sifar: Nilai yang ditetapkan secara eksplisit kepada sifar dalam konfigurasi fail akan mengatasi nilai lalai bukan sifar.

Untuk menunjukkan ini pendekatan:

  1. Buat konfigurasi lalai struct defConfig dengan lalai anda nilai.
  2. Muatkan data JSON daripada fail ke dalam fail pembolehubah rentetan.
  3. Gunakan json.NewDecoder() untuk menyahmarshal data JSON ke dalam defConfig.

Contoh kod:

var defConfig = &Config{
    S1: "",
    S2: "",
    S3: "abc",
    S4: "def",
    S5: "ghi",
}

const fileContent = `{"S2":"file-s2","S3":"","S5":"file-s5"}`

err := json.NewDecoder(strings.NewReader(fileContent)).Decode(defConfig)
if err != nil {
    panic(err)
}
Salin selepas log masuk

Penyelesaian ini memastikan bahawa nilai dalam konfigurasi lalai adalah ditimpa oleh nilai dalam konfigurasi fail, menyediakan cara yang boleh dipercayai dan fleksibel untuk menggabungkan struktur jenis yang sama.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggabungkan Dua Struktur Go yang Sama Jenis dengan Cekap?. 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
Artikel terbaru oleh pengarang
Cadangan popular
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan