gpt4 book ai didi

go - 如何使用反射在Golang中创建和设置基本体

转载 作者:行者123 更新时间:2023-12-01 22:14:06 30 4
gpt4 key购买 nike

我想测试函数setFieldValue()的工作方式。

func main() {

value := uint64(0x36)
resType := reflect.TypeOf(uint8(0))
expectedRes := uint8(0x36)

res := uint8(0)
setFieldValue(reflect.ValueOf(&res).Elem(), resType.Kind(), value)

if res == expectedRes {
fmt.Println("voila")
} else {
fmt.Println("nuts")
}
}

func setFieldValue(field reflect.Value, fieldKind reflect.Kind, fieldValue uint64) {
switch fieldKind {
case reflect.Uint8:
field.SetUint(fieldValue)
}
}

但是我不希望 res变量也具有 TypeOf(uint8(0))类型。如果我将res创建为
        res := reflect.New(resType)
setFieldValue(res, resType.Kind(), value)

它不起作用,因为res无法寻址。

使用反射创建变量然后在某些函数中设置其值的正确方法是什么?

或者如何获取新创建的变量的实例?

最佳答案

reflect.New返回表示一个指针的reflect.Value,该指针本身不可寻址,也不是您想要将该值设置为的值。但是,可寻址的是指针指向的值,这也是您要设置提供的值的值。

您可以使用res.Elem()取消引用指针。

func main() {
value := uint64(0x36)
resType := reflect.TypeOf(uint8(0))
expectedRes := uint8(0x36)

res := reflect.New(resType)
setFieldValue(res.Elem(), resType.Kind(), value)

if res.Elem().Interface() == expectedRes {
fmt.Println("voila")
} else {
fmt.Println("nuts")
}
}

关于go - 如何使用反射在Golang中创建和设置基本体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61521588/

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