引子
刚刚写了一个API用到了Golang的Slice,想着用Slice这么久了竟然不知道这到底是个什么东西。
只知道Slice和常规数组相比是可自动变长的,内部到底是怎么实现的呢?
于是今天就和同事一起研究了一下Golang中Slice的自动扩容机制,这里采用的是Golang1.12版本。
闲话少说,直接开整:
例1:
package main
import (
"fmt"
)
func main() {
//定义一个无初始长度的切片
a := []string{}
for i := 0; i < 6; i++{
a = append(a, "aaa")
fmt.Println("====")
//Slice的容量
fmt.Println(cap(a))
//Slice的长度
fmt.Println(len(a))
fmt.Println("====")
}
}
输出结果:
1
1
--------
2
2
--------
4
3
--------
4
4
--------
8
5
--------
8
6
--------
结论
由输出结果可以看出,容量达到2之后,当长度大于2时,Slice的容量会自动扩容为原来的2倍。
这里可以得出,Slice的容量会自动扩容的起点是2。
例2:
package ma