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

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

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

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

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

  1. 哪种方式好
    看完上面的,你应该知道什么时候用哪种方式好了吧
切片数组的内存

问题一:var buf = make([]byte, 64) 与 var buf [64]byte 与 var 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 函数通常更灵活,尤其是当你不知道确切的长度时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值