Golang常量怎么使用_const关键字详解
发布时间 - 2026-02-01 00:00:00 点击率:次Go 的 const 是编译期固化、无内存地址的真常量,必须在编译时确定值,不支持运行时函数调用或变量依赖;iota 是 const 块内重置的行计数器;无类型常量更灵活,显式类型增强安全约束。
Go 里的 const 不是“运行时只读”,而是“根本没地址、编译期就固化”——你连取地址 &Pi 都会报错,这才是它真正防篡改的底层逻辑。
常量必须编译期确定,函数调用、len、make 全都不行
很多人写 const buf = make([]byte, 1024) 或 const port = os.Getenv("PORT"),结果构建直接失败,错误是:constant initializer must be a compile-time constant。这是因为 Go 要求所有 const 值在编译时就能算出结果,不依赖任何运行时环境。
- ✅ 正确:
const Pi = 3.14159、const MaxRetries = 3 * 2、const IPv4Len = len("192.168.0.1")(len作用于字符串字面量时是编译期常量) - ❌ 错误:
const now = time.Now()、const s = strings.ToUpper("hello")、const n = len(mySlice) - ⚠️ 注意:
len("abc")合法,但len([]byte{"a","b","c"})不合法——后者涉及运行时构造切片
iota 是 const 块专属计数器,跨块重置、同行共享
iota 看似简单,但新手常栽在“为什么我的枚举从 0 变成 100?”或者“Red, Green, Blue 全是 0?”这类问题上。它不是全局变量,而是一个编译器内置的、仅在 const 块内生效的行号计数器。
- 每进入一个新
const (...)块,iota自动重置为 0 - 同一行多个常量共用同一个
iota值(如A, B = iota, iota→ A=0, B=0) - 跳过某值要显式处理:
_ = iota(丢弃)、Unused = iota + 1(偏移)、或直接写死Reserved = 99 - 示例:
const ( First = iota // 0 Second // 1 _ // 2,被丢弃 Fourth // 3 )
无类型常量

Go 的常量默认是“无类型”的(untyped),比如 const timeout = 5,它既可赋给 int,也能直接传给 time.Sleep(5 * time.Second);但如果你定义成 const timeout int = 5,它就只能当 int 用,不能直接参与 time.Duration 运算——这既是限制,也是类型安全的保障。
立即学习“go语言免费学习笔记(深入)”;
- ✅ 推荐无类型:数学常数、端口号、状态码等通用值(
const Port = 8080) - ✅ 推荐显式类型:需要和特定类型强绑定时,如
const Timeout time.Duration = 30 * time.Second,避免隐式转换歧义 - ⚠️ 混淆点:批量声明中若第一个带类型,后续省略类型则自动继承该类型(
const (A int = 1; B)→B也是int)
常量不能用于变量声明的“右侧初始化表达式”?其实是能的,但有边界
有人以为 const Max = 100; var limit = Max 会报错,其实完全合法——常量可以参与变量初始化,只要右边表达式本身是合法的。真正卡住的是“常量表达式中嵌套变量”:
- ✅ 合法:
const Max = 100; var x = Max * 2(Max是编译期常量,乘法仍是常量表达式) - ✅ 合法:
const Mode = "debug"; var cfg = Config{Env: Mode}(字符串常量赋值给 struct 字段) - ❌ 非法:
var v = 42; const c = v + 1(v是变量,无法参与常量计算) - ⚠️ 关键区别:常量能“用”,但不能“依赖变量”;变量能“用常量”,但不能“让常量反过来依赖自己”
最容易被忽略的一点:常量的“不可变性”不是靠运行时保护,而是靠编译器彻底剥离了它的内存存在——它没有地址、不占运行时空间、甚至不会出现在二进制符号表里(除非导出)。这意味着,哪怕你用 unsafe 也改不了它。这种设计不是为了炫技,而是为了让数组长度、switch 分支、泛型约束这些关键机制获得绝对确定性。
# go
# golang
# 端口
# switch
# 状态码
# 区别
# 隐式转换
# 字符串常量
# 为什么
# red
# 常量
# const
# 全局变量
# 字符串
# 无类型
# int
# 继承
# Struct
# 泛型
# var
# iota
# 切片
# len
# 量能
# 行号
# 报错
# 的是
# 更灵活
# 如果你
# 第一个
# 多个
# 出现在
# 也能
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
魔毅自助建站系统:模板定制与SEO优化一键生成指南
Android中AutoCompleteTextView自动提示
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
详解vue.js组件化开发实践
在线制作视频网站免费,都有哪些好的动漫网站?
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
活动邀请函制作网站有哪些,活动邀请函文案?
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
装修招标网站设计制作流程,装修招标流程?
javascript基本数据类型及类型检测常用方法小结
详解Oracle修改字段类型方法总结
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
Java遍历集合的三种方式
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
如何快速生成专业多端适配建站电话?
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
如何在万网开始建站?分步指南解析
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
PHP正则匹配日期和时间(时间戳转换)的实例代码
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
如何用AWS免费套餐快速搭建高效网站?
Python文件异常处理策略_健壮性说明【指导】
C++时间戳转换成日期时间的步骤和示例代码
javascript日期怎么处理_如何格式化输出
如何在阿里云虚拟服务器快速搭建网站?
如何用腾讯建站主机快速创建免费网站?
如何快速搭建支持数据库操作的智能建站平台?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
简单实现jsp分页
canvas 画布在主流浏览器中的尺寸限制详细介绍
如何在腾讯云服务器上快速搭建个人网站?
如何在万网利用已有域名快速建站?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
微信小程序 闭包写法详细介绍
黑客如何通过漏洞一步步攻陷网站服务器?
Python正则表达式进阶教程_复杂匹配与分组替换解析
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
Java垃圾回收器的方法和原理总结
js实现点击每个li节点,都弹出其文本值及修改
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
如何在香港服务器上快速搭建免备案网站?
网站优化排名时,需要考虑哪些问题呢?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
电商网站制作价格怎么算,网上拍卖流程以及规则?
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
Linux安全能力提升路径_长期防护思维说明【指导】
大型企业网站制作流程,做网站需要注册公司吗?
如何使用 jQuery 正确渲染 Instagram 风格的标签列表

