
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
4.3 常量与隐式类型转换原理
常量以及常量具有的一系列隐式类型转换需要借助Go语言编译器完成。对于涉及常量的运算,统一在编译时类型检查阶段完成,由compile/internal/gc.defaultlit2函数进行统一处理。


在defaultlit2函数的参数中,l代表操作符左边的节点,r代表操作符右边的节点。函数首先判断操作符左节点有无类型,如果有,则将操作符右边的类型转换成左边的类型。要注意的是,并不是所有的类型组合都能进行隐式转换。如下例中,字符串不能和非字符串进行组合,布尔类型不能和其他类型进行组合,nil不能和其他类型进行组合。

如果操作符左节点无类型,右节点有类型,则将左边的类型转换为右边的类型。小数的浮点表示法优先级如图4-1所示。如果操作符左、右节点都无具体类型,则根据整数(int)<符文数(rune)<浮点数(float)<复数(Imag)的优先级决定类型的转换。

图4-1 小数的浮点表示法优先级