Golang常量const为什么不能取地址

发布时间 - 2026-01-10 00:00:00    点击率:
Go 中 const 值没有内存地址,因其在编译期被直接替换为字面值,不分配运行时内存,故无法取地址,任何 &constValue 都会触发编译错误;需用 var 声明变量后取址。

Go 中 const 值没有内存地址

因为 const 在编译期就被替换成字面值,不分配运行时内存。Go 编译器会把所有对常量的引用直接内联为对应值(比如 const pi = 3.14159,后续写 &pi 时,编译器根本找不到一个“变量”来取地址)。

这和 C/C++ 不同:C 的 const 变量仍占内存(只是加了只读修饰),而 Go 的 const 是纯编译期符号,连符号表里都不一定保留。

&constValue 会直接报错 cannot take the address of ...

尝试对任何 const 取地址都会触发编译错误,无论类型是 intstring 还是自定义类型:

const name = "gopher"
ptr := &name // 编译错误:cannot take the address of name

常见误操作场景:

立即学习“go语言免费学习笔记(深入)”;

  • 想传指针给函数(比如 fmt.Printf("%s", &name))→ 改用 &temp(先赋值给变量)
  • 初始化结构体字段为指针(Config{Title: &name})→ 必须先声明变量:title := name; Config{Title: &title}
  • 在切片或 map 中存常量地址 → 不可行,需用变量兜底

替代方案:用变量包装常量再取地址

如果确实需要指针,唯一合法方式是用 var 显式声明变量,并初始化为该常量:

const mode = 0644
var modeVar = mode
permPtr := &modeVar // ✅ 合法

注意点:

  • 不能写成 var modeVar = constValue 然后立即取地址——必须分两步或确保变量已分配空间
  • 短变量声明 := 也有效:modeVar := mode; ptr := &modeVar
  • 这种变量不会被编译器优化掉,哪怕值和常量完全一样

为什么设计成这样?性能与语义一致性

Go 把常量视为“值本身”,不是“可寻址实体”。这种设计带来两个实际好处:

  • 避免对字面值取地址引发的歧义(比如 &42&"hello" 在其他语言中行为不一)
  • 让编译器能更激进地做常量折叠和内联,减少不必要的内存分配
  • 强制开发者区分“不可变值”(const)和“只读存储位置”(var + const 初始化)

真正容易被忽略的是:哪怕常量类型实现了接口,也不能直接取地址转为接口指针——必须经过变量中转。这点在写泛型约束或反射逻辑时特别容易踩坑。


# go  # golang  # c++  # 编译错误  # 为什么  # String  # 常量  # printf  # const  # 结构体  # int  # 指针  # 接口  # 泛型  # var  # 切片  # map  # 需用  # 的是  # 不分配  # 找不到  # 自定义  # 会把  # 报错  # 因其  # 必须先  # 这和 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何生成API文档?(Swagger/OpenAPI教程)  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  如何在香港服务器上快速搭建免备案网站?  如何用狗爹虚拟主机快速搭建网站?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  LinuxCD持续部署教程_自动发布与回滚机制  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  如何快速查询域名建站关键信息?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  如何实现建站之星域名转发设置?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  java中使用zxing批量生成二维码立牌  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  JavaScript模板引擎Template.js使用详解  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  教你用AI将一段旋律扩展成一首完整的曲子  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  如何打造高效商业网站?建站目的决定转化率  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何在阿里云虚拟服务器快速搭建网站?  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  清除minerd进程的简单方法  Laravel怎么在Controller之外的地方验证数据  Android Socket接口实现即时通讯实例代码  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  制作企业网站建设方案,怎样建设一个公司网站?  Laravel如何记录自定义日志?(Log频道配置)  JavaScript如何实现类型判断_typeof和instanceof有什么区别  详解vue.js组件化开发实践  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  如何在建站宝盒中设置产品搜索功能?  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  Laravel如何使用Eloquent进行子查询  JS去除重复并统计数量的实现方法  jQuery validate插件功能与用法详解  微信小程序 HTTPS报错整理常见问题及解决方案  JS经典正则表达式笔试题汇总  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  利用vue写todolist单页应用  香港网站服务器数量如何影响SEO优化效果?  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  如何快速搭建自助建站会员专属系统?  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  如何使用 jQuery 正确渲染 Instagram 风格的标签列表