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

时间:2019-02-08 12:49:46

标签: 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)如何获得原始类型的指针?

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

然后,您可以像这样使用assignmentsa取出b的地址:

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

这将输出(在type assertion上尝试):

int, *int
*int, *int

(注意:当您仅打印b时,由于它是接口类型,因此fmt包将打印包装在其中的(具体)值。)

查看相关问题:

Go Playground

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))