有下面 3 行代码:

// 32 位机器
1var x int32 = 32.0
2var y int = x
3var 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)也能编译通过。