![Go语言底层原理剖析](https://wfqqreader-1252317822.image.myqcloud.com/cover/131/40795131/b_40795131.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
3.2 Go语言中类型推断的特性
每个语言的类型推断能力是不同的,Go语言的目标是减少在其他静态类型语言中存在的混乱情况,Go语言的设计者认为Java或C++中的类型系统过于复杂[1]。因此,在设计Go语言时,他们对变量使用简单的类型推断,给人以编写动态类型代码的感觉,同时仍然保留静态类型的好处。
Go语言的类型推断目前还相对简单,没有涵盖参数和返回值之类的内容。在实践中,可以通过在声明新变量或常量时忽略类型信息或使用:=表示法来触发Go语言中的类型推断。例如,在Go语言中,以下三个语句是等效的。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_60_2.jpg?sign=1738868457-8eLqwMo9d4TEr64DmOCmgjYwkvAhR0w1-0-315cff58e102dc7f003a3660a30200cf)
以a:=333为例,变量a最终会被推断为int类型,可以用Printf的%T格式化打印出a的类型,输出结果为type:int。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_60_3.jpg?sign=1738868457-UT96p2kHllCYhPk2FduKyGWIPXwn25C3-0-9f6d198b784f3abcc0d9331c06405803)
由于Go语言的类型系统禁止了不同类型之间的转换(第4章中的常量除外),因此下例中的a已经被推断为int类型,不能够赋值给int64类型。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_60_4.jpg?sign=1738868457-Jcl6nsxvUpP5iN3z4c2sB6j3xhWaQW2K-0-b688a964e723d1bc387508a1061ac754)
Go语言的类型推断在处理包含变量标识符的推断方面是半智能的。本质上,编译器不允许对变量标识符引用的值进行强制类型转换,举几个例子:
下面这段代码能够正常运行,并且a的类型为float64。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_61_1.jpg?sign=1738868457-FajJrXlTbsC5smnqVnELVZGh3txputdJ-0-d9377e477d48af1f5dfd2a101fed4319)
下面的代码仍然正确,a会被推断为浮点数,1会被转换为浮点数与a的值相加。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_61_2.jpg?sign=1738868457-G8IIpwtcPrXi4pr9OiURBoCFNPoMzfqL-0-eb8df227fc008dcc57ee87b24993d542)
但是,下面的代码是错误的,即a的值已被推断为整数,而1.1为浮点数,不能将a强制转换为浮点数,相加失败。编译器报错:constant 1.1 truncated to integer。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_61_3.jpg?sign=1738868457-jPqYiExPu4StbT6TmQ8Vb5lASXTIPOdo-0-d85e7b02b631ee1bcb1461c15c81972e)
下面的例子犯了相同的错误,编译器提示类型不匹配:invalid operation:a+b(mismatched types int and float64)。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_61_4.jpg?sign=1738868457-7tou3OGeCeSoMvO2LW5ioDhUJivgu5qb-0-52a417b250733b43602454e0cdc83c23)