Heim >Backend-Entwicklung >Golang >Wie lassen sich Go-Strukturen effizient zusammenführen und gleichzeitig bestimmte Werte priorisieren?

Wie lassen sich Go-Strukturen effizient zusammenführen und gleichzeitig bestimmte Werte priorisieren?

Barbara Streisand
Barbara StreisandOriginal
2024-11-29 21:03:10405Durchsuche

How to Efficiently Merge Go Structs While Prioritizing Specific Values?

Strukturfelder effizient zusammenführen

Problem

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.

Reflexionsbasierte Lösung

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.

Encoding/JSON-basierte Lösung

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:

  • Fehlende Werte in config.json behalten den Standardwert bei Werte.
  • Werte in config.json überschreiben Standardwerte, auch wenn sie auf Null gesetzt sind.
  • Explizite Nullwerte in config.json überschreiben Standardwerte ungleich Null.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn