Go中数组与数组[:]的区别及Bolt源码buf[:]写法原因求解
Go 数组与
数组[:] 的核心差异 - 数组是值类型,长度属于类型的组成部分:例如
[4096]byte和[2048]byte是完全不同的两种类型,传递数组时会完整拷贝数组的全部内容,开销随数组长度线性增长。 数组[:]是基于原数组生成的切片,切片是引用类型,底层仅存储三个字段:指向原数组的内存指针、切片长度、切片容量。传递切片时仅会拷贝这个24字节(64位系统下)的小结构体,开销极低。- 切片和原数组共享底层内存,对切片内容的修改会直接同步到原数组,无需额外拷贝回写。
Bolt 源码使用
buf[:] 而非直接传 buf 的原因 你看到的代码中,buf 本身是固定长度的数组类型,pageInBuffer 方法的形参要求是切片类型,直接传数组会出现类型不匹配的编译错误,必须通过 buf[:] 转换为切片后才能传递。
除此之外还有性能层面的考虑:Bolt 默认页大小通常为4KB,如果直接传数组会触发完整的4KB内存拷贝,而传切片仅需拷贝24字节的切片头,同时函数内部对切片内容的修改可以直接生效到原数组,符合读页填充缓存的逻辑,避免了不必要的内存拷贝开销。
内容的提问来源于stack exchange,提问作者spongecaptain
相关产品推荐
相关产品推荐

