0

0

Golang基本类型使用指针是否有意义

P粉602998670

P粉602998670

发布时间:2026-01-06 11:37:44

|

936人浏览过

|

来源于php中文网

原创

应仅在需表达“未设置”或“函数内修改原值”时用*int;否则因拷贝成本低、指针增开销与panic风险,优先使用int。

golang基本类型使用指针是否有意义

对 Go 中的 intboolfloat64string 等基本类型,**绝大多数场景下使用指针没有意义,反而增加风险和开销**。只有极少数明确需要“可空性”或“函数内修改原值”的场景才值得考虑。

什么时候传 *int 而不是 int

核心判断依据就两个:是否需要表达“未设置”,或是否必须在函数内修改调用方的原始变量。

  • JSON 反序列化时区分字段是否存在:比如 Age *int 可以区分 {"age":0}(显式设为 0)和 {}(字段缺失),而 Age int 两者都解出 0
  • 函数需作为“输出参数”:例如配置解析器中,func parseTimeout(s string, out *time.Duration) error,让调用方传入一个地址,解析成功后直接写入——这比返回 time.Duration 再赋值更符合某些 API 设计习惯(但非常规)
  • 结构体中表示可选基础字段:如 type Config struct { MaxRetries *int },允许调用方不设置该字段,后续逻辑通过 if c.MaxRetries != nil 判断是否启用重试

为什么通常不该用 *int

因为 Go 的基本类型本身很小(int 通常是 8 字节),拷贝成本几乎为零;而指针引入了额外间接层、nil 检查负担、GC 压力,还容易引发 panic。

  • 性能无收益:传 int上复制 8 字节;传 *int 是复制 8 字节地址 + 额外一次内存寻址 + 潜在的堆分配(如果指针指向的是 new 出来的)
  • 安全风险高:解引用前若未判 nil,运行时直接 panic ——
    var p *int
    fmt.Println(*p) // panic: runtime error: invalid memory address or nil pointer dereference
  • 语义混淆:string 本身是只读的 header 结构(含指针),传 *string 并不能让你“修改原字符串内容”,只能替换整个字符串值,且不如直接返回新 string 清晰

常见误用与错误现象

开发者常因“想模仿其他语言的引用传递”或“看到别人用了就跟着用”,导致写出脆弱代码。

淄博分类信息港程序seo特别版
淄博分类信息港程序seo特别版

seo特别版程序介绍:注意:普通用户建议使用淄博分类信息港程序普通版本。主要针对seo需要增加了自定义功能:自定义文件路径;自定义文件名;自定义关键字。这些功能的作用,只有自己体会了。以下是淄博分类信息港程序的介绍:淄博分类信息港程序一套现成的城市分类信息网站发布系统。发布管理房屋、人才、招租、招聘、求购、求租、搬迁、运输、二手交易、招生培训、婚介交友等各类信息的发布和查询。淄博分类信息港发布程序

下载

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

  • 误以为能修改原始字符串内容*string 只能改它指向哪个字符串,无法像 C 那样改底层字节数组
  • 忽略初始化,直接解引用
    var user struct{ Name *string }
    fmt.Println(*user.Name) // panic
  • 在 map 或 slice 中大量存 *int:每个 new(int) 都是一次堆分配,小对象堆化会显著抬高 GC 压力
  • 接口实现不一致:如果某个方法用了 *int 参数,另一个却用 int,调用方容易传错,且无法通过编译器强制统一

真正需要指针语义时,优先考虑是否能用值类型 + 明确返回值替代;只有当“空/非空”语义不可省略(如数据库 NULL 映射、API 可选字段),才引入基本类型的指针——而且务必在文档和构造逻辑中明确其生命周期与 nil 含义。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

177

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

336

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

388

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

189

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

191

2025.06.17

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.07

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.2万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号