【问题标题】:Set the value of a struct field with reflection when the field is a pointer-to-x当字段是指向 x 的指针时,使用反射设置结构字段的值
【发布时间】:2018-03-03 10:25:35
【问题描述】:

我有一个指向各种原语的指针结构。该结构是应用程序的配置,字段是指针的原因是,我可以确定设置为默认值的字段和根本未设置的字段 - 强制执行“必需”字段。

这是一个简单的例子:

type Config struct {
    A *string
    B *int
    C *bool
    D *[]string // wildcard!
}

所以我通过reflect.ValueOf(*cfg) 获取reflect.Value,它会在每个元素上给我一个.Field,我会遍历它。

问题是,每个元素都没有通过CanAddrCanSet,我似乎找不到设置指针后面的值的方法。这是语言的限制吗?我需要使我的字段成为非指针吗?这很糟糕,因为无法确定用户是否指定了空字符串,或者根本没有设置它。

哦,设置/附加 [] 字符串字段的奖励积分!即使没有指针也让我感到困惑!

【问题讨论】:

    标签: pointers go reflection struct


    【解决方案1】:

    替换这些行:

    t := reflect.TypeOf(*cfg)
    v := reflect.ValueOf(*cfg)
    

    v := reflect.ValueOf(cfg).Elem()
    t := v.Type()
    

    获取一个可寻址的值。

    reflect.ValueOf(*cfg) 创建的值没有引用可寻址内存。解决方法是取消引用反射域中的指针。

    关于 [] 字符串。因为空切片和空切片之间存在差异,所以可能不需要使用 *[]string。在任何情况下,使用 reflect.Append 函数追加到切片:

    var s []string
    v := reflect.ValueOf(&s).Elem()
    v.Set(reflect.Append(v, reflect.ValueOf("hello")))
    v.Set(reflect.Append(v, reflect.ValueOf("world")))
    fmt.Println(s) // prints [hello world]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多