golang-slice为什么要使用 make

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的长度和容量变化。

本文链接:参与评论 »

--EOF--

提醒:本文最后更新于 347 天前,文中所描述的信息可能已发生改变,请谨慎使用。

Comments