透過反射或JSON 解組合併相同類型的結構體
在Go 中,你可能會遇到需要合併兩個結構體的場景具有相同類型,一個結構中的值可能會覆蓋另一個結構中的值。本文探討了實現此目的的兩種方法:使用 Go 的反射功能或將 JSON 資料解組到準備好的預設組態中。
反射方法(不建議)
反射方法如下所示,需要檢查零值以決定要覆寫哪些欄位。然而,這個解法並不理想,因為:
<br>func merge(default <em>Config, file </em>Config) (*Config) {<br> b := Reflect . ValueOf(預設).Elem()<br> o := Reflect.ValueOf(file).Elem()<p>for i := 0;我</p><pre class="brush:php;toolbar:false">defaultField := b.Field(i) fileField := o.Field(i) if defaultField.Interface() != reflect.Zero(fileField.Type()).Interface() { defaultField.Set(reflect.ValueOf(fileField.Interface())) }
}
傳回預設值
}
JSON 解組方法(推薦)
更優雅和靈活的方法是使用Go的encoding/json包並將JSON數據解組到準備好的預設值中配置。此方法有幾個優點:
示範這一點方法:
範例程式碼:
var defConfig = &Config{ S1: "", S2: "", S3: "abc", S4: "def", S5: "ghi", } const fileContent = `{"S2":"file-s2","S3":"","S5":"file-s5"}` err := json.NewDecoder(strings.NewReader(fileContent)).Decode(defConfig) if err != nil { panic(err) }
此解決方案確保預設配置中的值被中的值覆蓋檔案配置,提供可靠且靈活的方式來合併相同類型的結構。
以上是如何有效率地合併兩個相同類型的 Go 結構體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!