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”),然后将该字段更新为

假设我在Go中有一个结构,看起来像这样:

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
,我强烈建议你不要这样做。这能回答你的问题吗?太好了,这正是我想要的!非常感谢。