获取通过接口获得的var的指针

Nan*_*ank 0 pointers interface go address-operator

在以下代码中

var a int
var b interface{}

b = a

fmt.Printf("%T, %T \n", a, &a)
fmt.Printf("%T, %T \n", b, &b)
Run Code Online (Sandbox Code Playgroud)

输出:

int, *int 
int, *interface {}
Run Code Online (Sandbox Code Playgroud)

我希望&b的类型是int的指针.

我有两个问题:

1)为什么它是接口{}上的指针?

2)我怎样才能获得原始类型的指针?

icz*_*cza 6

&b=>这是应用于变量的地址运算符b,其类型为interface{}.所以&b将是一个指向*interface{}变量的类型指针b.如果采用类型变量的地址T,结果将始终为类型*T.

你不能获得变量的地址a从b,因为赋值:

b = a
Run Code Online (Sandbox Code Playgroud)

只需将值复制a到b.它包装了a类型的接口值中的值interface{},并将此接口值存储到其中b.此值完全脱离a.

通常,所有分配都会复制分配的值.Go中没有引用类型.如果你将ain 的地址存储b在第一位,最接近你想要的是,例如:

b = &a
Run Code Online (Sandbox Code Playgroud)

然后你可以使用类型断言来获取这样a的地址b:

fmt.Printf("%T, %T \n", a, &a)
fmt.Printf("%T, %T \n", b, b.(*int))
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

int, *int
*int, *int
Run Code Online (Sandbox Code Playgroud)

(注意:当你只是打印时b,因为它是一个接口类型,fmt包打印包含在其中的(具体)值.)

查看相关问题:

如何获取指向被屏蔽为接口的变量的指针?

用反射更改界面下的指针类型和值