Go 如何在运行时选择要更新的结构成员?
假设我在Go中有一个结构,看起来像这样:Go 如何在运行时选择要更新的结构成员?,go,data-structures,struct,updates,Go,Data Structures,Struct,Updates,假设我在Go中有一个结构,看起来像这样: LastUpdate struct { Name string `yaml:"name"` Address string `yaml:"address"` Phone string `yaml:"phone"` } var lu LastUpdate setFieldByName(&lu, "Name", "Russ Cox") 现在假设我想创建一个函数,它接受字段的名称(例如“Phone”),然后将该字段更新为
LastUpdate struct {
Name string `yaml:"name"`
Address string `yaml:"address"`
Phone string `yaml:"phone"`
}
var lu LastUpdate
setFieldByName(&lu, "Name", "Russ Cox")
现在假设我想创建一个函数,它接受字段的名称(例如“Phone”),然后将该字段更新为一个值,比如今天的日期
如何构建函数,使其接受字段名称并在结构中更新该字段
我知道我可以为每个场景(IF field==“Phone”){var.LastUpdate.Phone=time.Now().Date()}创建一个IF子句,但是我想构建这个函数,这样我就不必在以后每次向这个结构添加新成员时都添加IF子句。想法?使用包按名称设置字段
// setFieldByName sets field with given name to specified value.
// The structPtr argument must be a pointer to a struct. The
// value argument must be assignable to the field.
func setFieldByName(structPtr interface{}, name string, value interface{}) error {
v := reflect.ValueOf(structPtr)
v = v.Elem() // deference pointer
v = v.FieldByName(name) // get field with specified name
if !v.IsValid() {
return errors.New("field not found")
}
v.Set(reflect.ValueOf(value))
return nil
}
像这样使用它:
LastUpdate struct {
Name string `yaml:"name"`
Address string `yaml:"address"`
Phone string `yaml:"phone"`
}
var lu LastUpdate
setFieldByName(&lu, "Name", "Russ Cox")
标准库中的
reflect
包可以对结构之类的类型进行内省。您需要按顺序遍历字段以按名称查找它。设置字段值是可能的,但在传递可能不兼容的值(或类型)时会变得非常棘手。这是一个很滑的斜坡,不适合胆小的人。如果你是新来的go
,我强烈建议你不要这样做。这能回答你的问题吗?太好了,这正是我想要的!非常感谢。