go 语言 const 是编译期确定值的不可变绑定,必须初始化且仅支持基础字面量类型;iota 仅在单个 const 块内从 0 逐行自增,不跨块延续,混用显式值会中断其传播。

Go 语言里 const 不是“定义”常量,而是“声明”不可变绑定——它必须在编译期就能确定值,且类型推导严格,写错一行就报错。
const 声明必须带初始值
Go 不允许声明未初始化的 const,不像 var 可以留空。没给值?编译直接报 missing value in const declaration。
- ✅ 正确:
const pi = 3.14159(类型由右值推导为float64) - ✅ 正确:
const name string = "Alice"(显式指定类型) - ❌ 错误:
const port(无初始值,语法不通过) - ⚠️ 注意:即使后续用
const ( ... )块,每个标识符也得有对应值或使用 iota 推导
iota 只在 const 块内有效,且每行自增
iota 不是全局计数器,它只在单个 const 块里从 0 开始、每声明一行加 1。跨块重置,中间空行也不跳过。
- 常见误用:以为
iota能跨多个const块连续计数 → 实际每块都从 0 重新开始 - 常见误用:在
const块里混用显式值和iota却没注意隐式继承规则,比如:
const (
A = iota // 0
B // 1(自动继承 iota)
C = 100 // 显式赋值,后续 iota 不再影响 D
D // 100(不是 3!因为 C 覆盖了 iota 的传播)
)
- ? 提示:想跳过某行又不打断 iota 序列?用下划线占位:
_ = iota
const 类型不能是 slice、map、function 等运行时结构
Go 的 const 只支持基础字面量类型:布尔、数字、字符串、以及它们的底层类型别名。任何需要堆分配或运行时构造的东西都不行。
- ❌ 错误:
const names = []string{"a", "b"}(slice 字面量不允许) - ❌ 错误:
const cfg = map[string]int{"x": 1}(map 不可作常量) - ✅ 正确:
const maxRetries = 3(int字面量) - ✅ 正确:
const version = "v1.2.0"(字符串字面量) - ⚠️ 注意:哪怕类型是别名,只要底层是禁止类型,一样不行,比如
type ID []int,const id ID = []int{1}仍非法
真正容易被忽略的是:const 块中如果混用不同类型字面量(比如整数和浮点数),Go 会按上下文尝试隐式转换,但失败时错误信息非常简短——往往只报 cannot use ... as ... in assignment,得回头逐行核对类型推导是否一致。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











