Golang中的slice通过make函数进行初始化,make的主要作用如下:
为slice分配内存空间 通过make可以为slice分配内存,为元素预留存储空间。slice本身只是一个指针,通过make可以让它指向一个已经分配的底层数组。
设置slice长度和容量 make可以设置slice的长度len和容量cap。len决定当前slice可以存储的元素个数,cap决定slice目前可以使用的内存大小。
不同类型slice初始化 对不同类型如int、string等都可以通过make初始化对应的slice。
返回slice对象 make的返回值是一个slice,可以对这个slice直接使用不需要再做初始化。
例如:
s := make([]int, 5) // 分配int切片,长度和容量都是5
s := make([]string, 3, 5) // 分配string切片,长度3,容量5
所以总结来说,make主要用于为slice分配内存,设置其长度和容量,并返回一个已经初始化的slice值,这对slice的使用很重要。只有通过make初始化过后,slice才可以直接使用其内存来存储元素。
golang slice make的length和cap 区别是什么?
Golang slice 的 make 函数可以设置长度 length 和容量 capacity 两个参数。
length:决定当前slice可以存储的元素个数,也就是说可以通过索引 0 ~ length-1 来访问元素。
capacity:决定当前分配的底层数组可以存储的最大元素个数。
两者的区别和联系如下:
length 必须小于等于 capacity。也就是当前slice实际存储的元素不可以超过分配的最大容量。
一般来说,length = capacity。这种情况slice使用的底层数组刚刚好分配了需要的内存。
但也可以 length < capacity。这种情况表示分配的内存比实际需要的大,为后面的内容增加提供了动态扩展的空间。
当通过append等操作增加元素时,如果当前length == capacity,会自动的resize底层数组,增加实际分配的内存大小。
capacity 也决定了slice可以通过 append 扩展的范围。只有在 length < capacity 时,append 才可以继续扩展 slice。
所以总结:
length 决定了当前slice可访问的元素个数 capacity 决定了底层数组的最大容量,也决定了slice通过append能扩展的范围 一般length==capacity时性能最优,但length<capacity可以提供动态扩展的性能 两者规定了slice当前的状态和未来的增长能力。
请问如果我想要扩展一个slice的长度,但不改变底层数组的容量,应该怎么做呢?
如果你想扩展slice的长度(len),但不想改变slice的容量(cap),可以使用copy函数来实现:
func extendSlice(s []T) []T {
length := len(s)
capacity := cap(s)
// 新建一个长度加1,容量保持不变的新slice
newSlice := make([]T, length+1, capacity)
// 将原slice中的元素copy到新slice
copy(newSlice, s)
return newSlice
}
具体步骤:
计算原slice的长度和容量
使用make新建一个长度加1,但容量保持原容量大小的新slice
使用copy函数将原slice中的元素copy到新slice
返回新的扩容后但容量没变的slice
这样做的好处是:
扩容slice长度但不触发底层数组重新分配,避免了额外开销 容量保持不变, ensures future appends to the slice will not need to reallocate 一旦容量用完,之后append还是会自动扩容 所以通过copy函数来扩展长度可以很好地控制slice的长度和容量变化。
本文链接:https://iokde.com/post/golang-make-slice.html,参与评论 »
--EOF--
发表于 2023-10-08 14:05:07,并被添加「golang」标签。
本站使用「署名 4.0 国际」创作共享协议,转载请注明作者及原网址。tools更多说明 »
提醒:本文最后更新于 240 天前,文中所描述的信息可能已发生改变,请谨慎使用。
专题「chatgpt帮我写代码」的其它文章 »
- chatgpt帮我写代码-将文本中两列信息转json (Apr 13, 2023)
Comments