Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Menggabungkan Dua Struktur Go yang Sama dengan Cekap, Mengutamakan Nilai Bukan Sifar daripada Struktur Kedua?

Bagaimanakah Saya Boleh Menggabungkan Dua Struktur Go yang Sama dengan Cekap, Mengutamakan Nilai Bukan Sifar daripada Struktur Kedua?

Mary-Kate Olsen
Lepaskan: 2024-12-03 16:04:15
asal
577 orang telah melayarinya

How Can I Efficiently Merge Two Identical Go Structs, Prioritizing Non-Zero Values from the Second Struct?

Menggabungkan Medan Dua Struktur Identik

Tugasnya adalah untuk menggabungkan dua struct daripada jenis yang sama supaya medan dalam struct kedua mengatasi yang pertama, tetapi hanya jika mereka ditetapkan. Penyelesaian harus mengambil kira kemungkinan nilai sifar.

Pendekatan Berasaskan Refleksi

Pendekatan awal mempertimbangkan untuk menggunakan refleksi:

func merge(default *Config, file *Config) (*Config) {
  b := reflect.ValueOf(default).Elem()
  o := reflect.ValueOf(file).Elem()

  for i := 0; i < b.NumField(); i++ {
    defaultField := b.Field(i)
    fileField := o.Field(i)
    if defaultField.Interface() != reflect.Zero(fileField.Type()).Interface() {
     defaultField.Set(reflect.ValueOf(fileField.Interface()))
    }
  }

  return default
 }
Salin selepas log masuk

Walau bagaimanapun, pendekatan ini menghadapi kebimbangan mengenai penggunaan refleksi dan kesukaran dalam menyemak nilai sifar dalam semua kes.

JSON Unmarshaling Pendekatan

Penyelesaian alternatif memanfaatkan pakej pengekodan/json:

conf := new(Config) // New config
*conf = *defConfig  // Initialize with defaults

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

Pendekatan ini menawarkan beberapa kelebihan:

  • Ia secara automatik mengendalikan nilai yang hilang dan sifar dalam fail konfigurasi.
  • Ia mengekalkan penggantian eksplisit kepada sifar nilai.

Analisis Keputusan

Menggunakan pendekatan ini dengan konfigurasi lalai yang diberikan dan kandungan fail menghasilkan output berikut:

&amp;{S1: S2:file-s2 S3: S4:def S5:file-s5}
Salin selepas log masuk

Ini menunjukkan bahawa:

  • S1, tiada dalam fail, kekal sifar nilai.
  • S2, dinyatakan dalam fail, mengatasi nilai sifar lalai.
  • S3, ditetapkan secara eksplisit kepada sifar dalam fail, mengatasi nilai bukan sifar lalai.
  • S4, tiada daripada fail, mengekalkan nilai lalainya.
  • S5, yang dinyatakan dalam fail, mengatasi lalai nilai.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggabungkan Dua Struktur Go yang Sama dengan Cekap, Mengutamakan Nilai Bukan Sifar daripada Struktur Kedua?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan