gpt4 book ai didi

go - 从reflect.Value(foo)获取reflect.Value(&foo)

转载 作者:行者123 更新时间:2023-12-03 10:11:04 25 4
gpt4 key购买 nike

问题的标题几乎总结了一下。我正在使用Go进行反射,并且试图获取reflect.Value()指向的地址。
为什么?
我有一个可以通过两种方式接收结构的函数:
首先..这是结构

type UserInfo struct {
Name string `json:"name"`
Roles *[]model.Role `json:"role"`
UserId int `json:"user_id" db:"id"`
}
一:
var userInfo types.UserInfo
myFunc(&userInfo)
用这种方法我很好,因为它是指向分配了内存的结构的指针
第二种方法:
var userInfo *types.UserInfo
myFunc(userInfo)
所以在这里,如果我执行 reflect.Value(),它是一个零指针。
我想分配该结构并将userInfo指向新的地方。
现在,如果我也粘贴&userInfo,我可以轻松地做到这一点
并执行:
myFunc(dst interface{}, dstAddr interface{})
{
v := reflect.ValueOf(dstAddr)
t := reflect.TypeOf(dst)
ptr := reflect.New(t.Type())
...
v.Elem().Set(ptr)
}
现在,我除了 reflect.ValueOf(dst).Addr()reflect.ValueOf(&dst)相同外,但实际上 reflect.ValueOf(dst).CanAddr()返回false。
所以..有一种方法可以只获得 reflect.ValueOf(&dst)而获得 reflect.ValueOf(dst)吗?

最佳答案

无论您传递给 reflect.ValueOf() 或任何其他函数,都将创建一个副本。
就是说,reflect.Value(foo)可能无法将原始foo的地址退还给您,而只能将您的副本地址还给您。为避免进一步的困惑,在这种情况下, Value.CanAddr() 将返回false,让您知道可以使用 Value.Addr() 返回的地址不是大多数人期望的,它不是有用的地址。
如您所指示,您想传递一个值,所以传递&foo。这样,您就可以使用 foo 获得&foo所指向的Value.Elem()值。
还要注意,您通过foo获得的(包装的)Value.Elem()值将是可寻址的,因为它是从包装reflect.Value&foo获取的。因此,如果reflect.Value而不是 reflect.ValueOf(foo)而不是reflect.ValueOf(&foo).Elem(),则可以取回&foo
请参阅以下示例:

func main() {
var foo = 3

fmt.Println("Address:", &foo)
bar(&foo)
fmt.Println("After:", foo)
}

func bar(x interface{}) {
v := reflect.ValueOf(x)

v2 := v.Elem()
fmt.Println("Passed pointed value:", v2.Interface())
v2.Set(reflect.ValueOf(4))

fmt.Println("Address got from pointed value:", v2.Addr())
}
这将输出(在 Go Playground上尝试):
Address: 0xc000080010
Passed pointed value: 3
Address got from pointed value: 0xc000080010
After: 4

关于go - 从reflect.Value(foo)获取reflect.Value(&foo),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64220344/

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