


Bagaimanakah Saya Boleh Menggabungkan Dua Struktur dengan Bidang Bertindih dengan Cekap, Mengutamakan Nilai Satu Struktur?
Dec 18, 2024 am 01:52 AMMenggabungkan Medan Struktur Seiras
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:
- Mengendalikan Nilai Hilang Secara Automatik: Medan yang tiada daripada FileConfig akan diisi dengan nilai lalai daripada DefaultConfig.
- Timpa dengan Nilai Fail: Medan yang terdapat dalam FileConfig akan menimpa nilai dalam DefaultConfig.
- Mengekalkan Nilai Sifar: Malah nilai sifar yang ditetapkan secara eksplisit dalam FileConfig akan menimpa nilai lalai bukan sifar dalam DefaultConfig.
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!

Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah?

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego?

Bagaimana saya menulis objek dan stub untuk ujian di GO?

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya?

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go?

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO?

Bagaimana cara menulis fail dalam bahasa Go dengan mudah?

Bagaimanakah saya menulis tanda aras yang mencerminkan prestasi dunia secara tepat di GO?
