go的切片相对于数组就是它的长度不再是固定的可以自动扩容

在定义上只是比数组少了固定长度

数组的声明方式:

var 数组变量名 [元素数量]T

切片的声明方式

var name []T
lowhigh1<=索引值<4长度=high-low

通过别人文章中看到这个切片的说明,并给了示例如下:

func main() {
	a := [5]int{1, 2, 3, 4, 5}
	s := a[1:3]  // s := a[low:high]
	fmt.Printf("s:%v len(s):%v cap(s):%v\n", s, len(s), cap(s))
}

输出:

s:[2 3] len(s):2 cap(s):4

但是我有个疑问,为什么的子切片的容量是得到切片数组底层的数组的容量,从示例中看到底层数组的容量应该是5,为什么这里得到的确是4呢?

这个是因为简单表达式中第一low值其实是底层数组的指针,high表示的从指针处开始切的长度,容量就是从指针处到底层数组结尾的长度