gpt4 book ai didi

go - 反射设置作为 interface{} 传入的结构体字段

转载 作者:行者123 更新时间:2023-12-03 02:24:58 26 4
gpt4 key购买 nike

以下工作正常:

type MyStruct struct {
MyField int32
}

func SetReflectConcrete(obj *MyStruct, fieldName string, newValue interface{}) {
objElem := reflect.ValueOf(obj).Elem()
field := objElem.FieldByName(fieldName)
field.Set(reflect.ValueOf(newValue))
}

func main() {
myStruct := MyStruct{123}
SetReflectConcrete(myStruct, "MyField", int32{1234})
}

如何制作适用于任何结构的 SetReflect 函数的变体?到目前为止我所有的尝试都失败了。签名会是这样的:

func SetReflectInterface(obj interface{}, fieldName string, newValue interface{})

当这样调用它时,这是否可能

SetReflectInterface(myStruct, "MyField", int32{1234})

或者必须这样称呼

SetReflectInterface(&myStruct, "MyField", int32{1234})

(毕竟,interface{} 有一个指向该结构的指针。)

最佳答案

如您所述,将参数声明为 interface{} 类型。将指针传递给结构体,如最后一个代码片段中所示。

func SetReflectConcrete(obj interface{}, fieldName string, newValue interface{}) {
objElem := reflect.ValueOf(obj).Elem()
field := objElem.FieldByName(fieldName)
field.Set(reflect.ValueOf(newValue))
}

myStruct := MyStruct{123}
SetReflectConcrete(&myStruct, "MyField", int32(1234))

Run it on the playground .

反射值必须可寻址才能设置字段。如果直接从结构创建该值将不可寻址。

关于go - 反射设置作为 interface{} 传入的结构体字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57685693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com