在下面的代码中var a intvar b interface{}b = afmt.Printf("%T, %T \n", a, &a)fmt.Printf("%T, %T \n", b, &b)输出:int, *int int, *interface {}我希望 &b 的类型是 int 上的指针。我有两个问题:1)为什么它是 interface{} 上的指针?2)我怎样才能得到原始类型的指针?
2 回答
慕尼黑5688855
TA贡献1848条经验 获得超2个赞
&b
=> 这是应用于变量的地址运算符b
,其类型为interface{}
。所以&b
将是一个类型的指针*interface{}
,指向变量b
。如果您获取类型变量的地址T
,则结果将始终为类型*T
。
a
您无法从获取变量的地址b
,因为赋值:
b = a
只需将 的值复制a
到 中b
。它将 的值包装a
在类型为 的接口值中interface{}
,并将该接口值存储到 中b
。该值与a
.
通常,所有赋值都复制被赋值的值。Go 中没有引用类型。最接近您想要的是,如果您首先存储a
in的地址,例如:b
b = &a
然后你可以使用类型断言来获取 outa
的地址,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
包打印它包装的(具体)值。)
一只名叫tom的猫
TA贡献1906条经验 获得超3个赞
如果您不知道接口中存储的值的类型(因此,您不能显式使用类型断言),您可以使用反射包:
var a int
var b interface{}
b = &a
fmt.Println(reflect.TypeOf(b))
- 2 回答
- 0 关注
- 121 浏览
添加回答
举报
0/150
提交
取消