面试题答案
一键面试- 扩容大致规则:
- 如果新的容量(所需容量)小于当前容量的2倍,且当前切片的容量小于1024,则新容量会扩展为当前容量的2倍。
- 如果新的容量大于当前容量的2倍,则新容量会直接设置为新的容量。
- 如果当前切片的容量大于或等于1024,则新容量会扩展为当前容量的1.25倍,直到新容量大于或等于所需容量。
- 举例说明:
- 初始容量小于1024:
在这个例子中,初始容量为5,小于1024。当需要容纳10个元素时,所需容量为10,10小于当前容量5的2倍(10),所以新容量扩展为当前容量的2倍,即10。package main import ( "fmt" ) func main() { s := make([]int, 0, 5) for i := 0; i < 10; i++ { s = append(s, i) } fmt.Printf("初始容量5,增长后容量: %d\n", cap(s)) }
- 初始容量大于或等于1024:
初始容量为1024,当需要容纳1500个元素时,所需容量为1500。1500大于当前容量1024的2倍不成立,1024的1.25倍为1280(1024 * 1.25),1280小于1500,继续扩展,1280的1.25倍为1600(1280 * 1.25),1600大于1500,所以增长后容量为1600。package main import ( "fmt" ) func main() { s := make([]int, 0, 1024) for i := 0; i < 1500; i++ { s = append(s, i) } fmt.Printf("初始容量1024,增长后容量: %d\n", cap(s)) }
- 新容量大于当前容量2倍:
初始容量为5,当需要容纳20个元素时,所需容量为20,20大于当前容量5的2倍(10),所以新容量直接设置为所需容量20。package main import ( "fmt" ) func main() { s := make([]int, 0, 5) for i := 0; i < 20; i++ { s = append(s, i) } fmt.Printf("初始容量5,增长后容量: %d\n", cap(s)) }
- 初始容量小于1024: