这个问题的题目很大程度上概括了它。我正在使用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(),它是一个Nil指针。我想分配这个结构,并将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)?
发布于 2020-10-06 09:03:34
无论您传递给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())
}这将输出(在围棋游乐场上尝试它):
Address: 0xc000080010
Passed pointed value: 3
Address got from pointed value: 0xc000080010
After: 4https://stackoverflow.com/questions/64220344
复制相似问题