考慮一個具有多個欄位的 Config 結構體。您有兩個這種類型的結構,具有預設值的 DefaultConfig 和從檔案載入的 FileConfig。目標是合併這些結構,優先考慮 FileConfig 中的值,同時保留未設定的欄位。
一種方法涉及使用反射來比較字段值並選擇性地更新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 }
但是,此方法需要仔細處理零值,因為它可能會導致意外的結果覆蓋。
更優雅且零工作量的解決方案利用編碼/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) }
使用這種方法:
以上是如何在優先考慮特定值的同時有效合併 Go 結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!