gpt4 book ai didi

go - 从 REST API 调用更新对象 - 结构合并?

转载 作者:IT王子 更新时间:2023-10-29 01:17:27 26 4
gpt4 key购买 nike

我有一个接受稀疏更新的 JSON REST API,但我提出的模式似乎异常冗长。我是不是用错了方法?

(假设这是使用没有内置稀疏更新支持的数据存储。)

func choose(a, b *string) *string {
if a != nil {
return a
}
return b
}

type Model {
Id *string `json:"id"`
Field1 *string `json:"field1"`
Field2 *string `json:"field2"`
Field3 *string `json:"field3"`
...
}

func (m1 Model) Update(m2 Model) (m3 Model) {
m3.Id = choose(m2.Id, m1.Id)
m3.Field1 = choose(m2.Field1, m1.Field1)
m3.Field2 = choose(m2.Field2, m1.Field2)
m3.Field3 = choose(m2.Field3, m1.Field3)
...
return
}

func UpdateController(input Model) error {
previous, _ := store.Get(*input.Id)
updated := previous.Update(input)
return store.Put(updated)
}

理想情况下,我可以这样编写 UpdateController:

func UpdateController(input Model) {
previous, _ := store.Get(*input.Id)
updated, _ := structs.Update(previous, input)
return store.Put(updated)
}

(为清楚起见省略了错误处理。)

最佳答案

好吧,如果您愿意使用反射,问题就变得相当简单:

http://play.golang.org/p/dc-OnO1cZ4

func (m1 Model) Update(m2 Model) (m3 Model) {
old := reflect.ValueOf(m1)
new := reflect.ValueOf(m2)
final := reflect.ValueOf(&m3).Elem()
for i := 0; i < old.NumField(); i++ {
if !new.Field(i).IsNil() {
final.Field(i).Set(new.Field(i))
} else {
final.Field(i).Set(old.Field(i))
}
}
return
}

我们执行 reflect.ValueOf(&m3).Elem() 的原因是 v3 需要可设置,参见 http://blog.golang.org/laws-of-reflection

但基本上,通过使用反射,我们可以循环遍历结构字段,查看更新的字段是否为 nil,如果是,我们使用旧值。

关于go - 从 REST API 调用更新对象 - 结构合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30490473/

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