Go 修改给定字段名和值映射的结构值

Go 修改给定字段名和值映射的结构值,go,Go,这是我的结构: type TableFields struct { Name string Family string Age int } sample := TableFields{ Name: "bill", Family: "yami", Age: 25, } 这是一个非常简单的例子,我用它来描述我的问题 我想使用收到的映射中的键和值更改示例结构中的值。每次我收到map时,键和值都会不同。如何使用映射编辑示例结构 例如

这是我的结构:

type TableFields struct {
    Name   string
    Family string
    Age    int
}

sample := TableFields{
    Name:   "bill",
    Family: "yami",
    Age:    25,
}
这是一个非常简单的例子,我用它来描述我的问题

我想使用收到的
映射中的键和值更改
示例
结构中的值。每次我收到
map
时,键和值都会不同。如何使用
映射
编辑
示例
结构

例如:

updateTheseFieldsWithTheseVals := make(map[string]string)
updateTheseFieldsWithTheseVals["family"] = "yamie"
// this is my way
for key,val := range updateTheseFieldsWithTheseVals {
    // sample.Family=yamie works, but is not the answer I am looking for
    // sample.key = val  *This solution is not possible*
    oldValue := reflect.Indirect(reflect.ValueOf(get)).FieldByName(key).String()
    fmt.Println(oldValue) // result is yami

    oldValue = val
    fmt.Println(oldValue) //result is yamie
}
fmt.Println(updateTheseFieldsWithTheseVals)
// result :
// {bill yami 25}

这将运行,但不会更改
示例中的值

以下是一个按名称更新字符串字段的函数:

func update(v interface{}, updates map[string]string) {
    rv := reflect.ValueOf(v).Elem()
    for key, val := range updates {
        fv := rv.FieldByName(key)
        fv.SetString(val)
    }
}
像这样使用它:

updates := map[string]string{"Family": "yamie"}
sample := TableFields{
    Name:   "bill",
    Family: "yami",
    Age:    25,
}
update(&sample, updates)

关于函数的一些注释:

  • update
    函数需要一个指针值,以便更新原始值
  • 如果未找到字段或字段不是字符串类型,函数将死机。根据函数的使用方式,添加对
    fv.IsValid()
    fv.Kind()==reflect.String的检查可能会有所帮助

这里有一个按名称更新字符串字段的函数:

func update(v interface{}, updates map[string]string) {
    rv := reflect.ValueOf(v).Elem()
    for key, val := range updates {
        fv := rv.FieldByName(key)
        fv.SetString(val)
    }
}
像这样使用它:

updates := map[string]string{"Family": "yamie"}
sample := TableFields{
    Name:   "bill",
    Family: "yami",
    Age:    25,
}
update(&sample, updates)

关于函数的一些注释:

  • update
    函数需要一个指针值,以便更新原始值
  • 如果未找到字段或字段不是字符串类型,函数将死机。根据函数的使用方式,添加对
    fv.IsValid()
    fv.Kind()==reflect.String的检查可能会有所帮助

在我看来,反思的使用是重新评估我的设计的机会。也许有更好的方法来实现你的最终目标。在我看来,反思的使用是一个重新评估我的设计的机会。也许有更好的方法来实现你的最终目标。