讲师中心 微信公众号
AI工具推荐 视频效率加速

Golang指针与切片类型的使用差异_Golang指针与切片内存管理对比分析

浅宇君_3955

浅宇君_3955

发布时间:2026-02-08 09:55:02

|

410人浏览过

|

来源于php中文网

原创

切片传参不加因[]T本身是轻量引用类型,仅复制24字节头信息;加反而引发逃逸、降低可读性;唯一例外是需修改len/cap本身。

golang指针与切片类型的使用差异_golang指针与切片内存管理对比分析

切片传参为什么不用加 *?

因为 []T 本身就是轻量级引用类型:它只包含一个指针、一个长度和一个容量(共 24 字节),函数传参时只复制这三个字段,不拷贝底层数组。加 *[]T 反而多一层间接访问,还可能把切片头本身推到堆上(逃逸),得不偿失。

常见错误是看到“指针高效”就盲目套用:func process(s *[]byte) —— 这不仅没提速,还让调用方必须取地址(&buf),破坏了切片天然的可读性和安全性。

  • ✅ 正确做法:直接传 []byte,函数内用 s = s[:n] 或 append 修改内容(只要不扩容,就仍在原底层数组)
  • ❌ 错误信号:编译器提示 escape analysis 显示切片头逃逸,或压测发现 cache miss 上升
  • ⚠️ 唯一例外:你需要在函数内修改切片头三要素本身(比如想让调用方看到新的 len 或 cap 改变),但这种情况极少,通常说明设计有误

[]MyStruct 和 []*MyStruct 性能差多少?

取决于结构体大小和操作频率。以一个含 7 个 string + 7 个 int64 的典型结构体为例,单个值约 168 字节;追加 100 万次,[]MyStruct 耗时约 3.5ms,[]*MyStruct 仅需 0.25ms —— 差 14 倍。

这不是“指针快”,而是避免了每次 append 都复制上百字节。但代价是:每个元素都是堆分配对象,GC 压力上升;且访问 s[i].Field 多一次内存跳转。

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

chartjs-reporter
chartjs-reporter

此技能用于在用户需要将结构化数据(查询结果、CSV 摘要、JSON 记录或 Python 字典/列表)转换为独立的 HTML 页面时使用。

下载
  • ✅ 推荐用 []*MyStruct:当结构体 > 64 字节、切片长度常达万级以上、且频繁 append/sort/for range
  • ✅ 推荐用 []MyStruct:结构体小(如 type Point struct{ X, Y int })、生命周期短、或需 CPU 缓存友好(如图像像素处理)
  • ⚠️ 注意:sort.Slice 对指针切片排序更快,但 json.Marshal 对值切片更省内存(无指针间接层)

为什么从大数组截取切片容易导致内存泄漏?

因为切片持有对底层数组的指针。比如你有一个 100MB 的 [100_000_000]byte,只取前 10 个字节做 s := bigArr[:10],只要 s 还活着,整个 100MB 就不会被 GC 回收。

这不是 bug,是 Go 的设计使然 —— 共享底层数组本就是切片高效的基础。问题出在“意外长生命周期持有”。

  • ✅ 解决方案一(推荐):用 copy 拷贝出独立小切片:safe := make([]byte, 10); copy(safe, bigArr[:10])
  • ✅ 解决方案二:改用指针切片,如 []*byte,但注意这不能解决原始数组占用,只是转移引用粒度
  • ❌ 不要依赖 bigArr = nil:只要还有任意切片指向它,数组就不会释放

new([]T) 和 make([]T, 0, n) 到底有什么区别?

new([]T) 返回的是 *[]T,即一个指向 nil 切片的指针;make([]T, 0, n) 返回的是可用的、零长度但有容量的切片 []T。前者几乎没用,后者是复用内存的标准姿势。

典型错误:var s = new([]int); *s = append(*s, 1) —— 看似可行,实则每次 append 都触发扩容,且 *s 是堆变量,增加 GC 开销。

  • ✅ 正确预分配复用:用 make([]int, 0, 1024) 创建可重用切片,后续用 s = s[:0] 清空长度,不重建底层数组
  • ✅ sync.Pool 场景:定义 var pool = sync.Pool{New: func() interface{} { return make([]byte, 0, 1024) }},获取后直接 buf = buf[:0]
  • ⚠️ new([]T) 唯一合理用途:作为结构体字段的初始零值占位符(极少见),不要用于逻辑初始化

最常被忽略的一点:切片的“共享性”不是特性,而是责任。你写 s[i] = x 时,永远要问一句——这个 s 还有别人在用吗?

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

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

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

519

2024.02.23

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

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

596

2024.02.23

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

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

1176

2024.02.23

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

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

791

2024.03.05

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

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

1726

2024.05.21

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

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

4874

2025.06.09

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

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

2254

2025.06.10

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

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

4126

2025.06.17

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

40

2026.10.22

热门下载

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

精品课程

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

共101课时 | 21.1万人学习

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

共39课时 | 4.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn