Go中const是声明即绑定值,必须带编译期可求值的初始值,不可空声明;iota易因类型继承出错,字符串转[]byte高频调用会重复分配。

Go 里的 const 不是“定义”,而是声明即绑定值;没初始值直接报错,类型不匹配或混用 iota 容易悄悄出问题。
const 必须带值,不能空声明
Go 不允许只写 const port 这种形式——编译器会立刻报 missing value in const declaration。常量必须在声明时就确定值,且这个值得是编译期可求值的表达式。
-
const port = 8080✅ 类型由字面量推导为int -
const timeout time.Duration = 30 * time.Second✅ 显式指定类型,避免跨包传参时因类型隐含导致不兼容 -
const version❌ 缺少等号右边的值,语法错误 -
const dbHost = os.Getenv("DB_HOST")❌ 函数调用不能出现在常量表达式中
const 块里用 iota 要防类型继承陷阱
iota 只在当前 const 块内有效,从 0 开始每行自增。但一旦块中某行显式写了非 iota 表达式(比如字符串、浮点数),后续未显式赋值的常量会继承该类型,而不是继续用 int。
-
const ( ModeTCP = iota; ModeUDP; ModeHTTP )→ 全是int -
const ( ModeTCP = iota; ModeUDP; ModeHTTP = "http"; ModeHTTPS )→ModeHTTP和ModeHTTPS都是string,不是数字 - 混用不同类型的常量时,建议每行都显式写类型:
ModeHTTP string = "http",避免误判
字符串常量转 []byte 别在热路径里重复分配
定义 const MyJSON = `{"id":1}` 没问题,但每次调用 json.Unmarshal([]byte(MyJSON), &v) 都会新分配一个 []byte,底层虽指向只读内存,但逃逸分析可能把它当可变数据处理,影响性能。
立即学习“go语言免费学习笔记(深入)”;
- 高频使用的大字符串,提前转好:
var MyJSONBytes = []byte(MyJSON) - 更激进的零拷贝方案(需确认 API 支持):
unsafe.Slice(unsafe.StringData(MyJSON), len(MyJSON))(Go 1.20+) - 别把
const当运行时配置容器——需要动态值,就用var或init()
最常被忽略的是:const 块内类型继承规则和字符串转 []byte 的分配行为,这两处不报错,但会在运行时或性能上悄悄咬你一口。


















