知识卡片

无类型常量

普通读书笔记卡 · 1470

内容

Go 常量在编译期可暂时保持“无类型”,因此能以高精度参与运算,并在落入变量或上下文时再检查可表示性。它把表达灵活性留在编译期,把运行时类型安全保住。

参考来源

- 位置:《Go语言底层原理剖析》第4章《常量与隐式类型转换》4.1节《常量声明与生存周期》 - 结论依据:原文说明未命名常量"拥有未定义的类型",且 Go 规范要求"整数常量至少能够存储256位"、浮点数系数"至少能表示256位的小数",编译器为此借助 math/big 处理编译时的高精度大整数与浮点数;未命名常量只在编译期存在、不占用内存,因此可以推出"常量在编译期保持无类型、以高精度参与运算"的结论。 - 原始内容:其中,等式左边的常量叫作命名常量,等式右边的常量叫作未命名常量,拥有未定义的类型。当有足够的内存来存储整数值时,可以始终精确地表示整数。由于Go语言规范中要求整数常量至少能够存储256位,因此在实际中Go语言能涵盖几乎所有的整数常量……可以看到,在Go语言编译器中使用了大数包math/big来处理编译时的大整数和更高精度的浮点数。未命名常量只会在编译期间存在,因此其不会存储在内存中。