Go语言底层原理剖析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.2 Go语言中类型推断的特性

每个语言的类型推断能力是不同的,Go语言的目标是减少在其他静态类型语言中存在的混乱情况,Go语言的设计者认为Java或C++中的类型系统过于复杂[1]。因此,在设计Go语言时,他们对变量使用简单的类型推断,给人以编写动态类型代码的感觉,同时仍然保留静态类型的好处。

Go语言的类型推断目前还相对简单,没有涵盖参数和返回值之类的内容。在实践中,可以通过在声明新变量或常量时忽略类型信息或使用:=表示法来触发Go语言中的类型推断。例如,在Go语言中,以下三个语句是等效的。

以a:=333为例,变量a最终会被推断为int类型,可以用Printf的%T格式化打印出a的类型,输出结果为type:int。

由于Go语言的类型系统禁止了不同类型之间的转换(第4章中的常量除外),因此下例中的a已经被推断为int类型,不能够赋值给int64类型。

Go语言的类型推断在处理包含变量标识符的推断方面是半智能的。本质上,编译器不允许对变量标识符引用的值进行强制类型转换,举几个例子:

下面这段代码能够正常运行,并且a的类型为float64。

下面的代码仍然正确,a会被推断为浮点数,1会被转换为浮点数与a的值相加。

但是,下面的代码是错误的,即a的值已被推断为整数,而1.1为浮点数,不能将a强制转换为浮点数,相加失败。编译器报错:constant 1.1 truncated to integer。

下面的例子犯了相同的错误,编译器提示类型不匹配:invalid operation:a+b(mismatched types int and float64)。