【Go笔记】类型

类型推断

特性

  • 已经确定的类型不能进行隐式转化,因此类型被推断出来之后就不能隐式转换了
  • 不允许对变量标识符引用的值进行转换,如b := a + 1中,a必须和b的类型相同
  • intint64float32float64是四种不同的类型

原理

  • 在词法解析阶段,右边的常量会被解析为一个未定义的类型
  • 全是0~9的就是整数,字符中有小数点的就是浮点数,字符串的首字符为"',识别0判断进制
  • 抽象语法树阶段,赋值表达式结构体会被解析为一个节点
  • 在AST阶段整数通过big.Int进行高精度存储,浮点则通过big.Float来高精度存储
  • 类型检查阶段,右节点的Type字段会变成types.Types[TINT],其中types.Types是存储实际类型的数组

常量与隐式类型转换

常量生命及生存周期

  • 常量表达式中,等式左边为命名常量,右边为未命名常量。
  • 未命名常量拥有未定义的类型,内存足够时可以始终精确地表示整数,因为Go要求整数常量至少能存储256位
  • 对于浮点数,未命名常量有一些要求。
  • 若以2为底的科学计数法,则小数位至少256位,指数位至少16bits
  • 溢出则报错
  • 精度限制则四舍五入
  • 所以有两种策略
  • 表示为分数,并进行有利运算
  • 使用高精度浮点数
  • 可以发现Go的编译器使用了高精度浮点数
  • 未命名常量只会在编译期间存在,因此不会储存在内存中
  • 命名常量存在内存的静态只读区,不能被修改,也不能取其地址,对常量进行寻址操作是错误的

常量类型转换

  • 通常是未命名常量像命名变量的转换
  • 变量之间不能隐式转换,只能强制转换;变量和常量之间可以进行隐式转换
  • .0的浮点数可以隐式转换为整数
  • 未命名的浮点常量可以隐式转换为单精或双精
  • 未命名的证书常量可以隐式转换为双精
  • 常量表达式的结果优先级为复数 > 浮点数 > 符文数 (rune) > 整数,根据表达式中含有的常数类型来判断结果
  • 未命名常量与具体类型的常变量之间运算,会转换成具体类型。比如以下例子会报错
1
2
3
// 2.3不能转换为b的类型int
const b int = 1
const p = b * 2.3
  • 如果有自定义类型,未命名常量也会隐式转换,但是类型变量不允许隐式转换,需要进行显示转换(强制转换)
  • 隐式转换优先级(从低可以转到高):int < rune < float < Imag
  • typecheck/const.go

【Go笔记】类型
https://study.0x535a.cn/go-note/go-type/
Author
Stephen Zeng
Posted on
August 10, 2025
Licensed under