有下面 3 行代码:
// 32 位机器
1)var x int32 = 32.0
2)var y int = x
3)var z rune = x
它们是否能编译通过?为什么?
如果面试时问这道题,你需要想想面试官想考察你什么。
数字字面量
在 Go 语言中,字面量是无类型(untyped)的。无类型是什么意思?无类型意味着可以赋值给类似类型的变量或常量。用上面例子,32.0 是无类型的浮点数字面量,因此它可以赋值给任意数字相关类型变量(或常量)。以下都是合法的:
var a int64 = 32.0
var b int = 32.0
var c float32 = 32.0
var d complex64 = 32.0
var e byte = 32.0
var f rune = 32.0
所以上题中 1)是正确的。
不同类型
在目前 Go 1.16 版本中(实际上只有很早期的版本不是),int 类型在 32 位机器占 4 字节,64 位机器占 8 字节。所以,在 32 位机器上,int32 和 int 的内存占用和内存布局是完全一样的。但 Go 语言不会做隐式类型转换,int 和 int32 是不同的类型,因此上题中 2)编译不通过。
别名
rune 是什么类型?定义如下:
type rune = int32
很显然,rune 是 int32 的别名,因此题目中 3)也能编译通过。