gpt4 book ai didi

Go- 合并两个结构的值,采用非空字段

转载 作者:数据小太阳 更新时间:2023-10-29 03:39:44 26 4
gpt4 key购买 nike

给定两个结构,其中任何一个的某些字段都可能为空,合并它们的最优雅的方法是什么? (如果两者都有非空字段,则选择一侧?)

如果不比较每个字段,我不确定如何做到这一点。

最佳答案

如果您不太在意成本。我有一个非常低效的解决方案。使用带有 omitempty 标签的 json 编码和解码。希望它能在某处帮助你。

package main

import (
"fmt"
"encoding/json"
)

type myStruct struct{
Id int `json:"id,omitempty"`
Name string `json:"name,omitempty"`
Sex bool `json:"sex,omitempty"`
Age int `json:"age,omitempty"`
Addr string `json:"addr,omitempty"`
}

func MergeStruct(to interface{},from interface{}) error{
byte1,err := json.Marshal(to)
if err != nil {
return err
}
byte2,err := json.Marshal(from)
if err != nil {
return err
}
map1 := make(map[string]interface{})
err = json.Unmarshal(byte1,&map1)
if err != nil {
return err
}
map2 := make(map[string]interface{})
err = json.Unmarshal(byte2,&map2)
if err != nil {
return err
}
for k,v := range map2{
map1[k] = v
}
byteDest,err := json.Marshal(map1)
if err != nil {
return err
}
err = json.Unmarshal(byteDest,to)
return err
}

func main() {
st1 := myStruct{
Id:1,
Name:"saky1",
Addr:"addr1",
}
st2 := myStruct{
Id:2,
Name:"saky2",
Age:20,
}
fmt.Println("befor merge: ",st1)
MergeStruct(&st1,&st2)
fmt.Println("after merge: ",st1)

}

输出:

befor merge:  {1 saky1 false 0 addr1}
after merge: {2 saky2 false 20 addr1}

关于Go- 合并两个结构的值,采用非空字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50868183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com