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

将零 int 断言为 int32

将零 int 断言为 int32

Go
子衿沉夜 2023-07-26 16:28:08
我注意到 Go 断言对于零 int 并不像我预期的那样工作。这是代码:var i interface{}i = 0i32, ok := i.(int32)fmt.Println(ok)fmt.Println(i32)输出如下:false0我找不到这种行为的解释。这是一个错误吗?
查看完整描述

2 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

i不包含 an int32,它包含 an int,因此类型断言失败。

像这样直接将文字值分配给一个字面值interface{}或在简短的变量声明中使用一个字面值可能会有点令人困惑,因为您实际上无法看到所获得的值的类型;您需要了解常量“默认类型”的规则。如果这给您带来麻烦,您可以将其显式转换为类型,例如 i = int32(0),这将确保i确实包含int32.


查看完整回答
反对 回复 2023-07-26
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

不,这不是一个错误,这是一个定义明确的行为。

这行:

i = 0

是一个赋值,并且您使用无类型0整型常量来赋值i。由于需要一个(具体)类型来执行赋值(并且is 类型interface{}没有定义类型),因此将使用该无类型常量的默认类型,即int

答案是,无类型常量有一个默认类型,即一种隐式类型,如果需要类型而未提供类型,则会将其转换为值。

修改如下即可验证:

i2, ok := i.(int)

fmt.Println(ok)

fmt.Println(i2)

哪个输出:


true

0

如果您要使用类型常量:


i = int32(0)

那么是的,存储的值将是 类型int32,并且您将得到相同的输出:


i = int32(0)

i32, ok := i.(int32)

fmt.Println(ok)

fmt.Println(i32)

尝试Go Playground上的示例。



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

添加回答

举报

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