作者:mobiledu2502930533 | 来源:互联网 | 2022-11-18 12:33
在以下代码中
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)我怎样才能获得原始类型的指针?
1> icza..:
&b
=>这是应用于变量的地址运算符b
,其类型为interface{}
.所以&b
将是一个指向*interface{}
变量的类型指针b
.如果采用类型变量的地址T
,结果将始终为类型*T
.
你不能获得变量的地址a
从b
,因为赋值:
b = a
只需将值复制a
到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
(注意:当你只是打印时b
,因为它是一个接口类型,fmt
包打印包含在其中的(具体)值.)
查看相关问题:
如何获取指向被屏蔽为接口的变量的指针?
用反射更改界面下的指针类型和值