Heim >Backend-Entwicklung >Golang >Wie lassen sich Go-Strukturen effizient zusammenführen und gleichzeitig bestimmte Werte priorisieren?
Betrachten Sie eine Konfigurationsstruktur mit mehreren Feldern. Sie haben zwei Strukturen dieses Typs, DefaultConfig mit Standardwerten und FileConfig, die aus einer Datei geladen werden. Das Ziel besteht darin, diese Strukturen zusammenzuführen und dabei den Werten in FileConfig Priorität einzuräumen und gleichzeitig nicht festgelegte Felder beizubehalten.
Ein Ansatz besteht darin, Reflektion zu verwenden, um Feldwerte zu vergleichen und diese in DefaultConfig selektiv zu aktualisieren :
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 }
Diese Methode erfordert jedoch einen sorgfältigen Umgang mit Nullwerten, da dies zu unbeabsichtigten Fehlfunktionen führen kann überschreibt.
Eine elegantere und mühelosere Lösung nutzt das Encoding/JSON-Paket:
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) }
Mit diesem Ansatz:
Das obige ist der detaillierte Inhalt vonWie lassen sich Go-Strukturen effizient zusammenführen und gleichzeitig bestimmte Werte priorisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!