Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menggabungkan Struktur Go dari Jenis Yang Sama Dengan Cekap Menggunakan Pengekodan JSON?
Gabungkan Medan Struktur Identik dengan Pengekodan JSON
Dalam bidang pengaturcaraan Go, tugas menggabungkan medan daripada dua struktur yang sama jenis timbul dengan kerap. Pertimbangkan senario di mana anda mempunyai konfigurasi lalai, seperti:
type Config struct { path string id string key string addr string size uint64 } var DefaultConfig = Config{"", "", "", "", 0}
Dan konfigurasi yang dimuatkan daripada fail, seperti:
var FileConfig = Config{"", "file_id", "", "file_addr", 0}
Objektif anda adalah untuk menggabungkan kedua-dua konfigurasi ini supaya hasilnya mempunyai nilai daripada kedua-dua struct, dengan FileConfig menimpa sebarang nilai dalam DefaultConfig. Walau bagaimanapun, FileConfig mungkin tidak mengandungi semua medan.
Pada asalnya, anda memikirkan menggunakan refleksi untuk tugasan ini:
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, dalam keadaan ini, refleksi bukanlah penyelesaian yang optimum. Pendekatan yang lebih elegan adalah untuk memanfaatkan kuasa pakej pengekodan/json.
Pakej pengekodan/json menyediakan mekanisme mudah untuk menyahmarshal data JSON ke dalam struktur Go yang dipratentukan. Dengan menggunakan teknik ini, anda boleh menggabungkan konfigurasi anda dengan elegan:
import ( "encoding/json" "strings" ) const fileContent = `{"id":"file_id","addr":"file_addr","size":100}` func unmarshalConfig(conf *Config, content string) error { return json.NewDecoder(strings.NewReader(content)).Decode(conf) } func mergeConfigs(defConfig *Config, fileConfig *Config) error { if err := unmarshalConfig(defConfig, fileContent); err != nil { return err } for _, v := range fileConfig { defConfig[v.key] = v.value } return nil }
Dalam penyelesaian ini, fileConfig dipisahkan ke dalam konfigurasi lalai. Pakej pengekodan/json mengendalikan semua kerumitan menetapkan nilai medan, termasuk nilai yang hilang (yang akan menjadi lalai kepada nilai sifarnya) dan nilai yang ditentukan fail yang mengatasi nilai lalai.
Dengan menggunakan unmarshaling, anda mencapai yang mudah dan penyelesaian yang cekap untuk menggabungkan struktur daripada jenis yang sama, memastikan medan FileConfig yang ditetapkan akan diutamakan daripada nilai lalai.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggabungkan Struktur Go dari Jenis Yang Sama Dengan Cekap Menggunakan Pengekodan JSON?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!