切片容量翻倍
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 不会增长底层数组。
我正在学习 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 不会增长底层数组。