为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕运维8079593 2023-06-05 17:41:31
在下面的代码中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 中没有引用类型。最接近您想要的是,如果您首先存储ain的地址,例如: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包打印它包装的(具体)值。)


查看完整回答
反对 回复 2023-06-05
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

如果您不知道接口中存储的值的类型(因此,您不能显式使用类型断言),您可以使用反射包:

var a int

var b interface{}

b = &a

fmt.Println(reflect.TypeOf(b))


查看完整回答
反对 回复 2023-06-05
  • 2 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信