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())) }
}
kembali lalai
}
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:
Untuk menunjukkan ini pendekatan:
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) }
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!