当前位置: 首页 > news >正文

golang 切片使用技巧

一个案例

make([]T,0,5)make([]T,5)

这两行代码,都是初始化一个类型为T的切片,首先这个东西,都是切片,比数组好在了动态扩容,那么它的具体含义为

make([]T, 0, 5)

  1. 这行代码创建了一个切片类型为[]T,长度为0,容量为5的切片
  2. 这意味着切片没有任何元素,但它的底层数组的容量为5,可以容纳最多5T元素。切片的长度为0表示没有元素,但你可以通过追加元素来扩展切片的长度。

make([]T, 5)

  1. 这行代码创建了一个切片类型为[]T,长度为5,容量也为5的切片
  2. 切片中的五个元素都被初始化为 nil

总结起来,两者的区别在于切片的长度和容量的设置。

好,这儿感觉像是解释的很清楚了,那么搞明白什么是长度容量应该就差不多了

长度表示切片当前包含的元素个数,而容量表示切片底层数组的可用空间大小

切片的长度和容量之间的关系如下:

长度(length):切片当前包含的元素个数。可以通过内置函数 len() 来获取切片的长度。

容量(capacity):切片底层数组的可用空间大小。可以通过内置函数 cap() 来获取切片的容量。

听起来像是,长度是一个动词,是具体实时的元素,容量是一个名词,好吧

微妙用法

上面两种写法,说实话,都能用,反正元素往里面存都不会报错,我来更深层解读一下

建一个三峡要注意哪些细节

1. 切片自动扩容的性能损耗

当切片长度达到容量上限时,继续追加元素会触发切片扩容操作,会多出来扩容这个操作的性能损耗
这时候有杠精肯定会说:

一个需要存储10个元素的切片 一开始将容量设置为 10 个容量 一开始将容量设置为 5 个容量 + 再扩容 5 个容量 这两种方式,一开始的申请10个容量的时间 比 一开始的申请5个容量的时间还长呢 你从北京跑上海,一箱油加满跑完 和 中间服务区停下来再加一次跑完 哪个快?

这里要注意的是,长度>容量时才会扩容,而不是>=,每次扩容后的容量是上次容量*2

2. 容量大的切片,费内存不

对于make([]T, 0, 5),开始时没有元素,所以不会立即分配内存。当你开始向切片添加元素时,系统才会根据需要的容量逐步分配内存
对于make([]T, 5),初始长度为5,所以会立即分配内存来存储这5个元素

什么业务情况下省内存
当你不需要立即存储大量元素时,使用make([]T, 0, 5)可以节省内存
使用make([]T, 5)会立即分配内存,即使有些元素可能永远不会被使用

如果你需要预先分配足够的内存来存储元素以提高性能,那么使用make([]T, n)是合适的。如果你不确定需要多少元素,或者只想按需分配内存以节省内存,那么使用make([]T, 0, n)是更好的选择

3. 哪种方式好

看完上面的,你应该知道什么时候用哪种方式好了吧

切片数组的内存

问题一:var buf = make([]byte, 64)var buf [64]bytevar buf []byte三者区别?

  • 内存分配:

var buf = make([]byte, 64):这种方式会动态分配内存。Go语言会预先分配足够的内存来存储64个字节,并返回一个指向该内存区域的指针。
var buf [64]byte:这种方式会静态分配内存。所有的64个字节都会在声明时被预先分配。
var buf []byte:这种方式没有指定长度,因此默认长度为0。它只是声明了一个空的字节切片,没有分配内存。

  • 长度和容量:

var buf = make([]byte, 64):长度为64,容量至少为64(具体容量可能会因底层数组的重新分配而变化)。
var buf [64]byte:长度和容量都为64。
var buf []byte:长度为0,容量未指定(需要进一步分配)。

  • 可变性:

var buf = make([]byte, 64) 和 var buf []byte:这两种方式创建的是切片,因此是可变的(可以增长和缩小)。
var buf [64]byte:这种方式创建的是数组,长度是固定的,不可改变。

  • 性能:

静态分配的数组(如var buf [64]byte)可能在某些情况下性能更好,因为内存分配在编译时完成。然而,对于大多数用途,动态分配的切片(如var buf = make([]byte, 64))更为灵活。

  • 初始化:

var buf [64]byte:所有元素都被初始化为0。
var buf = make([]byte, 64)var buf []byte:这两种方式创建的切片不会被初始化,元素值为未知。

根据你的需求选择合适的方式。如果你需要一个可变长度的字节容器,应使用切片([]byte)。如果你需要一个固定长度的字节容器,并且希望预先分配所有需要的内存,那么数组([N]byte)可能更适合你。使用 make 函数通常更灵活,尤其是当你不知道确切的长度时。

http://www.jsqmd.com/news/527755/

相关文章:

  • Node.js开发者专属:用Konga给Kong API网关加个可视化控制台
  • 2026年麻将机品牌最新排名推荐:商用棋牌室稳定耐用靠谱品牌及用户口碑真实评价 - 品牌推荐
  • Keras模型部署超简单
  • 2026年天津热门汽车贴膜公司推荐,路安老李汽车贴膜靠谱吗排名如何? - 工业推荐榜
  • 南京化妆培训哪家强?2026年口碑机构大盘点,化妆培训口碑分析技术领航者深度解析 - 品牌推荐师
  • 2026年洁净车间企业费用揭秘,看看哪家性价比更高 - 工业品网
  • 论文降重破局指南:Paperxie 如何让 AI 生成内容顺利通过知网 / 维普检测
  • 高效掌握AI技能库:开发者必备工具集实用指南
  • 【直播通知】本周四,直播讲解 JeecgBoot Claude Code 技能集:自然语言驱动 AI 自动生成代码、表单、流程
  • 解决Final Shell连接CentOS7时java.net.ConnectException: Connection refused的实战指南
  • TI CCS工程依赖总报错?手把手教你正确迁移和打包TMS320F28P55x的空工程(附避坑指南)
  • 单卡福音!GLM-OCR极速部署方案实测,4090上运行流畅,解析速度快
  • Qwen3-TTS-1.7B-Base部署教程:阿里云ECS GPU实例镜像部署实操
  • AI: 如何在windows/android上使用无障碍功能保存微信群图片
  • Duix.Avatar全栈部署指南:从技术架构到行业落地的完整实践
  • 别再乱用BPMN网关了!用这4个真实业务场景,手把手教你选对Gateway
  • 【Vuejs】 Vue3 中这样使用 Icon 更优雅
  • 瑞祥黑金卡回收流程持续简化,2026年卡券变现观察 - 京回收小程序
  • 5大核心功能让猫抓视频嗅探工具成为网页资源获取专家
  • Ubuntu源硬盘挂载到本地计算机更新源
  • P11172 「CMOI R1」mex2
  • 空心杯电机厂家如何选不踩坑?2026年靠谱推荐自动化设备快响应高精度型号 - 十大品牌推荐
  • FastJson漏洞实战:手把手教你用JNDI反弹Shell(附完整工具链)
  • Live Avatar数字人模型入门指南:4步搞定虚拟人物视频生成
  • (2/3)Qt Creater 测试项目工程调用(.so/.a)—— 创建 QT 库文件(.so) or(.a)
  • 手把手教你用USB_FD工具刷写IKBC Poker固件(含避坑指南)
  • 2026年彩色便道砖厂家推荐:公园/市政/小区工程用水泥便道砖及陶瓷便道砖专业供应商选型指南 - 品牌推荐官
  • 自封装|数据导出组件,表格数据导出为excel文件,可实现导表头替换,自适应单元格宽度(个人学习记录)
  • ncmdump终极指南:3分钟掌握网易云音乐NCM格式快速转换技巧
  • 避坑指南:华为HCIA考试中最容易混淆的5个网络概念(含MAC地址查询技巧)