- Go语言底层原理剖析
- 郑建勋
- 560字
- 2021-10-15 18:09:06
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=1739576001-aprLzkFbapzTsuiVG3OUNrUWg5oKjTQp-0-5e5310d22efa7c2c83764a5faf7519db)
以a:=333为例,变量a最终会被推断为int类型,可以用Printf的%T格式化打印出a的类型,输出结果为type:int。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_60_3.jpg?sign=1739576001-lIX4oEZIAMvUp93TNsuuwczAf9xagnf7-0-b24855c1353d96bb0137865b1761314d)
由于Go语言的类型系统禁止了不同类型之间的转换(第4章中的常量除外),因此下例中的a已经被推断为int类型,不能够赋值给int64类型。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_60_4.jpg?sign=1739576001-2P87O2MmtBURjxqHOWdtITT3wcUYIkh6-0-fc3f373260f74d49c550bcf1e100cc0b)
Go语言的类型推断在处理包含变量标识符的推断方面是半智能的。本质上,编译器不允许对变量标识符引用的值进行强制类型转换,举几个例子:
下面这段代码能够正常运行,并且a的类型为float64。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_61_1.jpg?sign=1739576001-w76KEBM0HTABFHhIx63Xg4YDeIhH1do8-0-7f5f803826af6393e3d2f3219d147445)
下面的代码仍然正确,a会被推断为浮点数,1会被转换为浮点数与a的值相加。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_61_2.jpg?sign=1739576001-uNIgzAjHXlaJ6szqOoSrglATPwKBb13l-0-4d6ca24725921cff457526f34a7792cf)
但是,下面的代码是错误的,即a的值已被推断为整数,而1.1为浮点数,不能将a强制转换为浮点数,相加失败。编译器报错:constant 1.1 truncated to integer。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_61_3.jpg?sign=1739576001-KC7JgEmIzVzcNvO3kQCCtT94uSAKqgPB-0-731a4d80f58d79d152eba5e6d8b41ec3)
下面的例子犯了相同的错误,编译器提示类型不匹配:invalid operation:a+b(mismatched types int and float64)。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_61_4.jpg?sign=1739576001-vHzbz1CExssusZrcO5GeWQRGS21rEAX5-0-fb92d491cb1c0243caecdaff1cf0e52d)