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

Get pointer on var obtained via interface

在下面的代码中

var a int
var b interface{}

b = a

fmt.Printf("%T, %T \n", a, &a)
fmt.Printf("%T, %T \n", b, &b)

输出:

int, *int 
int, *interface {}

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

我有两个问题:

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

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

&b => 这是address operator应用于变量b,其类型是interface{}。所以&b将是一个*interface{}类型的指针,指向变量b。如果您取 T 类型变量的地址,结果将始终是 *T.

类型

无法从b获取变量a的地址,因为赋值:

b = a

简单地将a的值复制到b中。它将 a 的值包装在类型 interface{} 的接口值中,并将此接口值存储到 b 中。该值与 a.

完全分离

一般来说,所有 assignments 复制分配的值。 Go 中没有引用类型。如果您首先将 a 的地址存储在 b 中,那么最接近您想要的内容,例如:

b = &a

然后你可以使用type assertionb得到a的地址,像这样:

fmt.Printf("%T, %T \n", a, &a)
fmt.Printf("%T, %T \n", b, b.(*int))

此输出(在 Go Playground 上尝试):

int, *int
*int, *int

(注意:当你简单打印b时,由于它是接口类型,fmt包打印它包裹的(具体)值。)

查看相关问题:

刚刚完成. In case if you don't know the type of the value stored in the interface (and, hence, you can't explicitly use type assertion), you can use reflect包:

var a int
var b interface{}
b = &a
fmt.Println(reflect.TypeOf(b))