gpt4 book ai didi

go - 给定另一个动态修改 Golang struct{} 值的属性

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

我在路由器处理程序中有这段代码

    decoder := json.NewDecoder(r.Body)
var t person.Model
err := decoder.Decode(&t). // t is a struct value
item, ok := v.People[params["id"]]. // ok is a struct value

if t.Handle != "" {
item.Handle = t.Handle
}

if t.Work != "" {
item.Work = t.Work
}

if t.Image != "" {
item.Image = t.Image
}

if t.Firstname != "" {
item.Firstname = t.Firstname
}

if t.Lastname != "" {
item.Lastname = t.Lastname
}

if t.Email != "" {
item.Email = t.Email
}

但我想让它动态化,像这样:

["Handle", "Work", "Image", "Firstname", "Lastname", "Email"].forEach(v => {
if t[v] != "" {
item[v] = t[v]
}
});

这对 Golang 来说是可能的吗?

最佳答案

使用 reflect包装:

func setFields(dst, src interface{}, names ...string) {
d := reflect.ValueOf(dst).Elem()
s := reflect.ValueOf(src).Elem()
for _, name := range names {
df := d.FieldByName(name)
sf := s.FieldByName(name)
switch sf.Kind() {
case reflect.String:
if v := sf.String(); v != "" {
df.SetString(v)
}
// handle other kinds
}
}
}

用指向值的指针调用它:

setFields(&item, &t, "FirstName", "LastName", "Email", "Handle")

Playground example

如果您的实际目标是只覆盖 JSON 中存在的字段,那么就这样做:

item, ok := v.People[params["id"]]. 
decoder := json.NewDecoder(r.Body)
err := decoder.Decode(&item)

Playground example

关于go - 给定另一个动态修改 Golang struct{} 值的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53028246/

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