首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从reflect.Value(&foo)获得reflect.Value(foo)

从reflect.Value(&foo)获得reflect.Value(foo)
EN

Stack Overflow用户
提问于 2020-10-06 06:21:39
回答 1查看 337关注 0票数 1

这个问题的题目很大程度上概括了它。我正在使用Go处理反射,并试图获取reflect.Value()所指向的地址。

为什么?

我有一个函数,它可以以两种方式接收一个结构:第一..这是结构

代码语言:javascript
复制
type UserInfo struct {
    Name   string        `json:"name"`
    Roles  *[]model.Role `json:"role"`
    UserId int           `json:"user_id" db:"id"`
}

第一:

代码语言:javascript
复制
var userInfo types.UserInfo
myFunc(&userInfo)

使用此方法,我很好,因为它是指向已分配内存的结构的指针

第二种方法:

代码语言:javascript
复制
var userInfo *types.UserInfo
myFunc(userInfo)

所以在这里,如果我做reflect.Value(),它是一个Nil指针。我想分配这个结构,并将userInfo指向新的位置。现在,如果粘贴&userInfo并执行以下操作,我可以轻松地做到这一点:

代码语言:javascript
复制
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)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

参见此示例:

代码语言:javascript
复制
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())
}

这将输出(在围棋游乐场上尝试它):

代码语言:javascript
复制
Address: 0xc000080010
Passed pointed value: 3
Address got from pointed value: 0xc000080010
After: 4
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64220344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档