【问题标题】:reflection - get type of single slice element反射 - 获取单片元素的类型
【发布时间】:2020-05-14 18:08:16
【问题描述】:

我想递归地迭代结构定义,并为切片获取一种奇异元素。然后,创建该类型的空实例。例如:

type Path struct {
  Name string
  Points []Coordinate
}
type Coordinate struct {
  Latitude float64
  Longitude float64
}

假设类型在运行时未知,我如何创建嵌套类型的空实例(在上面的示例中为坐标)。我的意思是:

x := Coordinate{}

在输入时我得到 Path(可以是任何其他结构,具有不同类型的切片)?

【问题讨论】:

  • 您自己能访问Points 字段吗?您只需要获取该切片的元素类型并为其创建一个新的零值吗?
  • 这就是问题所在,我不知道如何使用反射或其他方法动态创建零值。
  • 有一个reflect.Zero 函数接受reflect.Type 并返回reflect.Value
  • @mkopriva reflect.Zero() 返回一个不可寻址、不可设置的值。如果需要更改/设置,最好使用reflect.New().Elem()

标签: go reflection slice


【解决方案1】:

如果您有某个值的reflect.Type 描述符,您可以使用reflect.New() 函数来获取指向新的零值的指针。

这将返回一个reflect.Value 值。这将是一个指针,要获取指向对象的reflect.Value,请使用Value.Elem()。要“解包”reflect.Value() 中保存的值,您可以使用 Value.Interface()

所以如果你有一个切片的reflect.Type描述符,你可以使用Type.Elem()来获取切片元素类型的reflect.Type描述符。

看这个例子:

p := Path{
    Name: "foo",
    Points: []Coordinate{
        {1.1, 2.2},
        {3.3, 4.4},
    },
}

v := reflect.ValueOf(p)
f := v.FieldByName("Points")

cv := reflect.New(f.Type().Elem()).Elem()
c := cv.Interface()
fmt.Printf("%#v\n", c)

这个输出(在Go Playground上试试):

main.Coordinate{Latitude:0, Longitude:0}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2012-04-03
    • 2015-09-13
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多