切片容量翻倍

Capacity of slice doubles

我正在学习 golang,同时使用以下代码练习切片:

package main

import "fmt"

func main() {

    var count int
    var subject string
    subjects := make([]string, 0)

    fmt.Print("Enter total number of subjects:")
    fmt.Scan(&count)

    for count != 0 {
        fmt.Print("\n\nEnter subject name: ")
        fmt.Scan(&subject)
        subjects = append(subjects, subject)
        fmt.Printf("\nlen=%d \ncap=%d \n%v\n", len(subjects), cap(subjects), subjects)
        count--
    }

}

结果如下,我得到:

Enter subject name: physics

len=4 cap=4 [hindi english maths physics]

Enter subject name: geography

len=5 cap=8 [hindi english maths physics geography]

为什么5号容量翻倍,如何按顺序增加容量

“正确顺序”在这种情况下不适用。 Go slice 由一个数组支持,每次在达到容量时附加到它时都需要复制它。通过制作更大容量的数组,Go 试图最小化复制操作的数量,从而使 append 函数性能更高。

如果你事先知道一些元素,你可以用它来设置初始容量:

fmt.Print("Enter total number of subjects:")
fmt.Scan(&count)

subjects := make([]string, 0, count)

除非超出初始容量,否则 Go 不会增长底层数组。