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的检查可能会有所帮助
在我看来,反思的使用是重新评估我的设计的机会。也许有更好的方法来实现你的最终目标。在我看来,反思的使用是一个重新评估我的设计的机会。也许有更好的方法来实现你的最终目标。