我注意到 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
.
芜湖不芜
TA贡献1796条经验 获得超7个赞
不,这不是一个错误,这是一个定义明确的行为。
这行:
i = 0
是一个赋值,并且您使用无类型0
整型常量来赋值i
。由于需要一个(具体)类型来执行赋值(并且i
s 类型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上的示例。
- 2 回答
- 0 关注
- 126 浏览
添加回答
举报
0/150
提交
取消