首頁 > 後端開發 > Golang > 如何在優先考慮特定值的同時有效合併 Go 結構?

如何在優先考慮特定值的同時有效合併 Go 結構?

Barbara Streisand
發布: 2024-11-29 21:03:10
原創
416 人瀏覽過

How to Efficiently Merge Go Structs While Prioritizing Specific Values?

高效率合併結構體欄位

問題

考慮一個具有多個欄位的 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 的解決方案

更優雅且零工作量的解決方案利用編碼/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)
}
登入後複製

使用這種方法:

  • config.json 中缺少的值將保留預設值值。
  • config.json 中的值會覆寫預設值,即使它們設為零。
  • config.json 中的明確零值將覆寫非零預設值。

以上是如何在優先考慮特定值的同時有效合併 Go 結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板