Go 常量使用

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 仍然继续递增。


易错点

  1. const 定义后不能修改。
  2. Go 没有枚举关键字,常用常量组模拟枚举。
  3. iota 每个 const 块重新从 0 开始。
  4. iota 是按行递增,不是按变量个数递增。

快问快答

Q1:Go 里怎么定义枚举?

答:

Go 没有 enum,通常用 const 常量组配合 iota

Q2:iota 是什么?

答:

它是常量声明里的行计数器,在一个 const 块中从 0 开始,每一行自动加 1

Q3:iota 遇到继承表达式时怎么算?

答:

没写表达式的行会继承上一行表达式,但这一行的 iota 值仍然会递增。


一句话总结

const 管固定值,常量组管枚举,iota 管按行递增的枚举编号。