You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go中数组与数组[:]的区别及Bolt源码buf[:]写法原因求解

Go 数组与 数组[:] 的核心差异
  • 数组是值类型,长度属于类型的组成部分:例如 [4096]byte 和 [2048]byte 是完全不同的两种类型,传递数组时会完整拷贝数组的全部内容,开销随数组长度线性增长。
  • 数组[:] 是基于原数组生成的切片,切片是引用类型,底层仅存储三个字段:指向原数组的内存指针、切片长度、切片容量。传递切片时仅会拷贝这个24字节(64位系统下)的小结构体,开销极低。
  • 切片和原数组共享底层内存,对切片内容的修改会直接同步到原数组,无需额外拷贝回写。
Bolt 源码使用 buf[:] 而非直接传 buf 的原因

你看到的代码中,buf 本身是固定长度的数组类型,pageInBuffer 方法的形参要求是切片类型,直接传数组会出现类型不匹配的编译错误,必须通过 buf[:] 转换为切片后才能传递。
除此之外还有性能层面的考虑:Bolt 默认页大小通常为4KB,如果直接传数组会触发完整的4KB内存拷贝,而传切片仅需拷贝24字节的切片头,同时函数内部对切片内容的修改可以直接生效到原数组,符合读页填充缓存的逻辑,避免了不必要的内存拷贝开销。

内容的提问来源于stack exchange,提问作者spongecaptain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:57:07