Pertimbangkan struct Config dengan berbilang medan. Anda mempunyai dua struct jenis ini, DefaultConfig dengan nilai lalai dan FileConfig dimuatkan daripada fail. Matlamatnya adalah untuk menggabungkan struct ini, memberi keutamaan kepada nilai dalam FileConfig sambil mengekalkan medan yang tidak ditetapkan.
Satu pendekatan melibatkan penggunaan refleksi untuk membandingkan nilai medan dan mengemas kini secara terpilih mereka dalam DefaultConfig :
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, kaedah ini memerlukan pengendalian nilai sifar dengan teliti, kerana ia boleh membawa kepada penulisan ganti yang tidak diingini.
Penyelesaian yang lebih elegan dan sifar usaha menggunakan pakej pengekodan/json:
import ( "encoding/json" "io/ioutil" ) var defConfig = &Config{ S1: "def1", S2: "def2", S3: "def3", } func main() { fileContent, err := ioutil.ReadFile("config.json") if err != nil { panic(err) } err = json.NewDecoder(bytes.NewReader(fileContent)).Decode(&defConfig) if err != nil { panic(err) } fmt.Printf("%+v", defConfig) }
Dengan pendekatan ini:
Atas ialah kandungan terperinci Bagaimana untuk Mencantumkan Struktur Go dengan Cekap Sambil Mengutamakan Nilai Tertentu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!