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

Pointers 获取通过接口获取的var上的指针,pointers,go,interface,address-operator,Pointers,Go,Interface,Address Operator,在下面的代码中 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=>这是应用于变量b的指针,其类型为接口{}。So&b将是一个*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=>这是应用于变量b的指针,其类型为接口{}。So&b将是一个*interface{}类型的指针,指向变量b。如果采用类型为T的变量的地址,则结果将始终为*T类型

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

b = a
只需将a的值复制到b中。它将a的值包装在interface{}类型的接口值中,并将该接口值存储到b中。此值与a完全分离

通常情况下,所有复制对象都会复制指定的值。Go中没有引用类型。如果您首先将a的地址存储在b中,则最接近您想要的地址,例如:

b = &a
然后你可以用下面的方式从b那里得到a的地址:

fmt.Printf("%T, %T \n", a, &a)
fmt.Printf("%T, %T \n", b, b.(*int))
这将在以下位置进行尝试:

注意:当您简单地打印b时,由于它是接口类型,fmt包将打印包装在其中的具体值

见相关问题:

只是为了完成。如果您不知道接口中存储的值的类型,因此无法显式使用类型断言,则可以使用包:


这只是一个吹毛求疵/友好的建议:尽量避免使用接口{}。这是一个功能强大的工具,有时你无法避免,但这是语言新手在不应该使用接口{}时犯的一个常见错误
int, *int
*int, *int
var a int
var b interface{}
b = &a
fmt.Println(reflect.TypeOf(b))