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
Mary-Kate Olsenasal
2024-12-03 16:04:15578semak imbas

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
 }

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)
}

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}

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!

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