【发布时间】:2021-01-21 00:16:02
【问题描述】:
问题的标题几乎概括了它。我正在使用 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.Value(foo)得到reflect.Value(&foo),你传递的foo是一个副本,你只能得到副本的地址,不能得到原的地址。 -
@icza - 我想要实现的是只获得一个参数。如果我只发送 reflect.Value(&foo),那么 reflect.Value(&foo).Elem() 应该是 Reflect.Value(foo) 正确的?
-
是的,没错。
标签: go pointers reflection