Go 追加时数组大小不能增加一倍

Go 追加时数组大小不能增加一倍,go,slice,Go,Slice,为了 结果是 package main import "fmt" func main() { b := make([]int, 1, 5) printSlice("b", b[:cap(b)]) b2 := append(b, 1) b3 := append(b2, 1) b4 := append(b3, 1) b5 := append(b4, 1) printSlic

为了

结果是

package main

import "fmt"

func main() {


    b := make([]int, 1, 5)  
    printSlice("b", b[:cap(b)])
    
    b2 := append(b, 1)
    b3 := append(b2, 1)
    b4 := append(b3, 1)
    b5 := append(b4, 1)
    
    printSlice("bbbb", b5[:cap(b5)])
    
    b6 := append(b5, 1)
    
    printSlice("bbbb", b6[:cap(b6)])
    
    
}

func printSlice(s string, x []int) {
    fmt.Printf("%s len=%d cap=%d %v\n",
        s, len(x), cap(x), x)
}
看起来最后一个追加是基础数组大小的两倍,有没有办法说将其设置为大小6

有没有办法说是6号的


不,Append做它做的事情。但是,没有什么可以阻止您提供具有所需上限的切片。

如果使用内置的,则无法控制结果容量。它没有记录容量增长战略,因此除了附加的元素将适合它之外,没有什么可以期待的。它通常分配比需要更多的资金,考虑未来的增长以减少未来的分配。列出您具有reguarding append的所有保证以及结果切片的容量:

如果s的容量不够大,无法容纳附加值,append将分配一个新的、足够大的基础数组,该数组同时容纳现有的切片元素和附加值。否则,append将重新使用基础数组

如果要控制生成的片的容量,必须自己分配,复制旧片并附加到新片,例如:

b len=5 cap=5 [0 0 0 0 0]
bbbb len=5 cap=5 [0 1 1 1 1]
bbbb len=10 cap=10 [0 1 1 1 1 1 0 0 0 0]
然后输出将在以下服务器上进行尝试:

如您所见,需要做的事情很多:使用备份数组创建新切片,复制旧切片,然后执行追加操作。这可以通过创建像make[]int,lenb5+1这样的新切片来优化,然后最后的追加就是b6[lenb6-1]=1。在追加单个元素时一直执行这些操作是一种浪费,这就是为什么追加会分配更多的元素,这样就不必一直执行

见相关问题:


如果你需要一个特定的容量,你可以分割或分配你想要的容量。append在一般情况下是最有效的。这里提出了一种可能的解决方案:
b6 := make([]int, len(b5), len(b5)+1)
copy(b6, b5)
b6 = append(b6, 1)
b len=5 cap=5 [0 0 0 0 0]
bbbb len=5 cap=5 [0 1 1 1 1]
bbbb len=6 cap=6 [0 1 1 1 1 1]