在以下代码中
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)如何获得原始类型的指针?
答案 0 :(得分:6)
&b
=>这是应用于变量b
的{{3}},其类型为interface{}
。因此&b
将是类型*interface{}
的指针,指向变量b
。如果您使用类型为T
的变量的地址,则结果将始终为类型*T
。
由于赋值,您无法从a
获取变量b
的地址,
b = a
只需将a
的值复制到b
中。它将a
的值包装在类型为interface{}
的接口值中,并将该接口值存储到b
中。此值与a
完全分离。
通常,所有address operator复制所分配的值。 Go中没有引用类型。如果首先将a
的地址存储在b
中,则最接近您想要的地址,例如:
b = &a
然后,您可以像这样使用assignments从a
取出b
的地址:
fmt.Printf("%T, %T \n", a, &a)
fmt.Printf("%T, %T \n", b, b.(*int))
这将输出(在type assertion上尝试):
int, *int
*int, *int
(注意:当您仅打印b
时,由于它是接口类型,因此fmt
包将打印包装在其中的(具体)值。)
查看相关问题:
How to get a pointer to a variable that's masked as an interface?
答案 1 :(得分:1)
只需完成icza's answer。如果您不知道存储在接口中的值的类型(因此无法显式使用类型断言),则可以使用reflect包:
var a int
var b interface{}
b = &a
fmt.Println(reflect.TypeOf(b))