在下面的代码中
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) 我怎样才能得到原始类型的指针?
在下面的代码中
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) 我怎样才能得到原始类型的指针?
&b
=> 这是应用于变量的地址运算符b
,其类型为interface{}
。所以&b
将是一个类型的指针*interface{}
,指向变量b
。如果您获取类型变量的地址T
,则结果将始终是类型*T
。
您无法从 获取变量的地址a
,b
因为赋值:
b = a
只需复制a
into的值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
包会打印包装在其中的(具体)值。)
查看相关问题: