Masalah: Memandangkan dua struct dengan medan berkemungkinan bertindih, bagaimana seseorang boleh menggabungkannya, mengutamakan medan struct kedua berbanding yang pertama?
Dalam contoh yang disediakan, Config struct mempunyai beberapa medan. Matlamatnya adalah untuk menggabungkan dua contoh struct ini (DefaultConfig dan FileConfig), dengan FileConfig diutamakan. Walau bagaimanapun, FileConfig mungkin tiada medan.
Pendekatan Refleksi:
Coretan kod yang disediakan menggunakan refleksi untuk menyemak sama ada nilai medan dalam FileConfig bukan lalai untuk jenisnya . Jika ya, ia menetapkan medan dalam DefaultConfig kepada nilai FileConfig.
Pendekatan Berasaskan JSON Ringkas:
Pendekatan alternatif dan cekap ialah menggunakan pengekodan/json pakej untuk menyahkod kandungan FileConfig menjadi salinan DefaultConfig. Kaedah ini menawarkan beberapa faedah:
Pelaksanaan:
import ( "encoding/json" ) type Config struct { S1 string S2 string S3 string S4 string S5 string } func MergeConfig(defaultConfig, fileConfig *Config) *Config { // Make a copy of the default configuration mergedConfig := &Config{*defaultConfig} // Unmarshal the file configuration into the merged configuration if err := json.Unmarshal([]byte(fileConfig), mergedConfig); err != nil { // Handle error } return mergedConfig }
Penggunaan:
// Load the configuration from a file fileContent := `{"S2":"file-s2","S3":"","S5":"file-s5"}` fileConfig := &Config{} if err := json.NewDecoder(strings.NewReader(fileContent)).Decode(fileConfig); err != nil { // Handle error } // Initialize the default configuration defConfig := &Config{ S1: "", S2: "", S3: "abc", S4: "def", S5: "ghi", } // Merge the configurations mergedConfig := MergeConfig(defConfig, fileConfig) fmt.Println(mergedConfig)
Output:
&{S1: S2:file-s2 S3: S4:def S5:file-s5}
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggabungkan Dua Struktur dengan Bidang Bertindih dengan Cekap, Mengutamakan Nilai Satu Struktur?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!