先看下面的一段代码:

package main

import "fmt"

func main() {
    var numbers4 = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    myslice := numbers4[3:6:8]
    fmt.Printf("myslice为 %d, 其容量为: %d\n", myslice, cap(myslice))

	myslice2 = myslice[:cap(myslice)]
	fmt.Printf("myslice: %d", myslice2)
    fmt.Printf("myslice的第四个元素为: %d", myslice2[3])
}

输出如下:

myslice为 [4 5 6], 其容量为: 5
myslice: [4 5 6 7 8]myslice的第四个元素为: 7

从上面看myslice它的长度是3即(6 -3), 容量是5即(8-3),所以myslice的实际引用的数组为[4,5,6,7,8],故myslice2是[4,5,6,7,8]。
若myslice中只有一个冒号,即 myslice := numbers4[3:6] ,则myslice它的长度是3即(6 -3), 容量是7(10 -3),即实际引用的数组为[4,5,6,7,8,9,10]。
所以,当slice中有两个冒号时,即slice[start:index:max],它的容量就是(max - start),实际引用的数组时从数组start索引开始到max索引为止,但不包括max索引处的元素。