【Go笔记】类型
类型推断
¶特性
- 已经确定的类型不能进行隐式转化,因此类型被推断出来之后就不能隐式转换了
- 不允许对变量标识符引用的值进行转换,如
b := a + 1
中,a必须和b的类型相同 int
和int64
,float32
和float64
是四种不同的类型
¶原理
- 在词法解析阶段,右边的常量会被解析为一个未定义的类型
- 全是0~9的就是整数,字符中有小数点的就是浮点数,字符串的首字符为
"
或'
,识别0判断进制 - 抽象语法树阶段,赋值表达式结构体会被解析为一个节点
- 在AST阶段整数通过
big.Int
进行高精度存储,浮点则通过big.Float
来高精度存储 - 类型检查阶段,右节点的Type字段会变成
types.Types[TINT]
,其中types.Types
是存储实际类型的数组
常量与隐式类型转换
¶常量生命及生存周期
- 常量表达式中,等式左边为命名常量,右边为未命名常量。
- 未命名常量拥有未定义的类型,内存足够时可以始终精确地表示整数,因为Go要求整数常量至少能存储256位
- 对于浮点数,未命名常量有一些要求。
- 若以2为底的科学计数法,则小数位至少256位,指数位至少16bits
- 溢出则报错
- 精度限制则四舍五入
- 所以有两种策略
- 表示为分数,并进行有利运算
- 使用高精度浮点数
- 可以发现Go的编译器使用了高精度浮点数
- 未命名常量只会在编译期间存在,因此不会储存在内存中
- 命名常量存在内存的静态只读区,不能被修改,也不能取其地址,对常量进行寻址操作是错误的
¶常量类型转换
- 通常是未命名常量像命名变量的转换
- 变量之间不能隐式转换,只能强制转换;变量和常量之间可以进行隐式转换
.0
的浮点数可以隐式转换为整数- 未命名的浮点常量可以隐式转换为单精或双精
- 未命名的证书常量可以隐式转换为双精
- 常量表达式的结果优先级为复数 > 浮点数 > 符文数 (rune) > 整数,根据表达式中含有的常数类型来判断结果
- 未命名常量与具体类型的常变量之间运算,会转换成具体类型。比如以下例子会报错
1 |
|
- 如果有自定义类型,未命名常量也会隐式转换,但是类型变量不允许隐式转换,需要进行显示转换(强制转换)
- 隐式转换优先级(从低可以转到高):int < rune < float < Imag
typecheck/const.go
【Go笔记】类型
https://study.0x535a.cn/go-note/go-type/