Go 常量代码路径:
这一章要记住什么
这一章主要讲三个点:
const定义的是编译期常量。- 常量可以用来模拟枚举。
iota适合生成一组递增常量。
1. const 基本使用
代码里:
go
const a, b = "val", 200
常量一旦定义,后面不能再修改。
text
变量 var:
可以重新赋值
常量 const:
定义后不能修改
总结一下
如果一个值在程序运行期间不应该变化,就用 const。
2. 常量模拟枚举
代码里:
go
const (
Unkonw = 0
Success = 1
Fail = 2
)
Go 没有专门的 enum 关键字,常用一组常量来表达枚举含义。
text
0 -> Unknown
1 -> Success
2 -> Fail
这里代码里 Unkonw 应该是拼写问题,更常见写法是 Unknown。
总结一下
Go 里通常用 const (...) 定义一组状态码、类型码、业务枚举。
3. 常量表达式
代码里:
go
const (
a = "123"
b = 10
c = unsafe.Sizeof(a)
)
常量可以由编译期能确定的表达式计算出来。
unsafe.Sizeof(a) 返回的是变量或值占用的字节大小。
text
a 是 string
|
v
string 本身可以理解成:
指向底层数据的指针 + 长度
|
v
在 64 位机器上通常是 16 字节
总结一下
常量不是只能写死字面量,也可以用编译期能算出来的表达式。
4. iota
代码里:
go
const (
a = iota
b
c
)
结果是:
text
a = 0
b = 1
c = 2
iota 在每个 const 块里从 0 开始,每换一行自动加 1。
更复杂的例子:
go
const (
val1, val2 = iota + 1, iota + 2
val3, val4
val5, val6 = iota + 10, iota * 10
val7, val8
)
可以理解成:
text
第 0 行:iota = 0 -> val1=1, val2=2
第 1 行:iota = 1 -> val3=2, val4=3
第 2 行:iota = 2 -> val5=12, val6=20
第 3 行:iota = 3 -> val7=13, val8=30
总结一下
iota 不是变量,它是常量声明里的行计数器。
没写表达式的行,会沿用上一行的表达式,但 iota 仍然继续递增。
易错点
const定义后不能修改。- Go 没有枚举关键字,常用常量组模拟枚举。
iota每个const块重新从0开始。iota是按行递增,不是按变量个数递增。
快问快答
Q1:Go 里怎么定义枚举?
答:
Go 没有 enum,通常用 const 常量组配合 iota。
Q2:iota 是什么?
答:
它是常量声明里的行计数器,在一个 const 块中从 0 开始,每一行自动加 1。
Q3:iota 遇到继承表达式时怎么算?
答:
没写表达式的行会继承上一行表达式,但这一行的 iota 值仍然会递增。
一句话总结
const 管固定值,常量组管枚举,iota 管按行递增的枚举编号。