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 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.
Penyelesaian alternatif memanfaatkan pakej pengekodan/json:
conf := new(Config) // New config *conf = *defConfig // Initialize with defaults err := json.NewDecoder(strings.NewReader(fileContent)).Decode(&conf) if err != nil { panic(err) }
Pendekatan ini menawarkan beberapa kelebihan:
Menggunakan pendekatan ini dengan konfigurasi lalai yang diberikan dan kandungan fail menghasilkan output berikut:
&{S1: S2:file-s2 S3: S4:def S5:file-s5}
Ini menunjukkan bahawa:
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!