0

在下面的代码中

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)为什么它是 interface{} 上的指针?

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

4

2 回答 2

6

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

您无法从 获取变量的地址ab因为赋值:

b = a

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

通常,所有分配都会复制所分配的值。Go 中没有引用类型。a如果您首先存储in的地址,您可以获得最接近您想要的内容b,例如:

b = &a

然后你可以使用类型断言来获取a的地址,b如下所示:

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

这个输出(在Go Playground上试试):

int, *int
*int, *int

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

查看相关问题:

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

使用反射在接口下更改指针类型和值

于 2019-02-08T12:52:12.623 回答
1

只是为了完成icza的回答。如果您不知道存储在接口中的值的类型(因此,您不能显式使用类型断言),您可以使用反射包:

var a int
var b interface{}
b = &a
fmt.Println(reflect.TypeOf(b))
于 2019-02-08T13:37:42.837 回答