将零 int 断言为 int32

我注意到 Go 断言对于零 int 并不像我预期的那样工作。这是代码:


var i interface{}

i = 0

i32, ok := i.(int32)

fmt.Println(ok)

fmt.Println(i32)

输出如下:


false

0

我找不到这种行为的解释。这是一个错误吗?


子衿沉夜
浏览 127回答 2
2回答

蝴蝶刀刀

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

芜湖不芜

不,这不是一个错误,这是一个定义明确的行为。这行:i = 0是一个赋值,并且您使用无类型0整型常量来赋值i。由于需要一个(具体)类型来执行赋值(并且is 类型interface{}没有定义类型),因此将使用该无类型常量的默认类型,即int。答案是,无类型常量有一个默认类型,即一种隐式类型,如果需要类型而未提供类型,则会将其转换为值。修改如下即可验证:i2, ok := i.(int)fmt.Println(ok)fmt.Println(i2)哪个输出:true0如果您要使用类型常量:i = int32(0)那么是的,存储的值将是 类型int32,并且您将得到相同的输出:i = int32(0)i32, ok := i.(int32)fmt.Println(ok)fmt.Println(i32)尝试Go Playground上的示例。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go