【问题标题】:golang reflection to set first value of a struct to its zero valuegolang反射将结构的第一个值设置为零值
【发布时间】:2019-12-10 02:30:53
【问题描述】:

去游乐场:https://play.golang.org/p/ck3PtydW3YT

我有一个类似的结构:

type Input struct {
    InputA *InputA
    InputB *InputB
    InputC *InputC
}

我正在尝试使用反射将第一个值(在本例中为 *InputA)设置为零值(&InputA{}),但它不起作用:

    actionInput = Input{}
    v := reflect.ValueOf(actionInput)

    i := 0
    typ := v.Field(i).Type()

    inputStruct := reflect.New(typ).Elem().Interface()

    reflect.ValueOf(&actionInput).Elem().Field(i).Set(reflect.ValueOf(inputStruct))

我猜这是因为它是一个指针,但我不确定如何解决这个问题

【问题讨论】:

  • 您将第一个字段设置为零值。指针的零值为 nil。如果需要将其设置为指向结构零值的指针,则必须创建该结构的新实例,获取指向该结构的指针,然后设置它。
  • 这就是我在定义inputStruct 时尝试做的事情,但显然这会创建一个新的“*InputA”,而不是一个新的“InputA”。这是有道理的,但我不知道如何根据我的意图解决这个问题。
  • 如果你想要一个新的InputA,那就是reflect.New(v.Field(i).Elem().Type()).Interface()

标签: go reflection


【解决方案1】:

下面的代码应该可以工作。如果该字段是一个指针,它会创建一个该指针指向的类型的实例,并设置它。

    typ := v.Field(i).Type()
    var inputStruct reflect.Value
    if typ.Kind()==reflect.Ptr {
       inputStruct=reflect.New(typ.Elem())
    } else {
        inputStruct = reflect.New(typ).Elem()
    }

    reflect.ValueOf(&actionInput).Elem().Field(i).Set(inputStruct)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2021-11-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多