切片的类型是 []T,T 是切片元素的类型。和数组不同的是,切片没有固定的长度。属于变长数组
切片的字面值和数组字面值很像,不过切片没有指定元素个数:
letters := []string{"a", "b", "c", "d"}
切片可以内置函数 make 创建,函数签名为:func make([]T, len, cap) []T
T 代表被创建的切片元素的类型。函数 make 接受一个类型、一个长度和一个可选的容量参数。
var s []byte
s = make([]byte, 5, 5)
当容量参数被忽略时,它默认为指定的长度。下面是简洁的写法:
s := make([]byte, 5)
可以使用内置函数 len 和 cap 获取切片的长度和容量信息。
b := []byte{'g', 'o', 'l', 'a', 'n', 'g'}
a := b[m:n] //b[m]到b[n-1]中的元素赋值给新的切片
要增加切片的容量必须创建一个新的、更大容量的切片,然后将原有切片的内容复制到新的切片。
append增加切片元素时,如果超出原有切片长度,则会重新申请一个新的切片,然后放入新增元素,
之后将新切片命名为原来的切片名
如果多个切片同时指向同一个数组,一个切片改变数组的值,则所有相关的切片的值都会被改变
eg:
func main() {
a := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
s1 := a[:6] //[0 1 2 3 4 5]
s2 := a[5:] //[5 6 7 8 9]
fmt.Println(s1, len(s1), cap(s1)) //6 10
fmt.Println(s2, len(s2), cap(s2)) //5 5
s3 := s1[3:7] //
fmt.Println(s3, len(s3), cap(s3)) //[3 4 5 6] 4 7
s4 := make([]int, 3, 6)
s4 = append(s4, 1, 2, 3)
fmt.Println(s4, len(s4), cap(s4)) //[0 0 0 1 2 3] 6 6
s1[5] = 10 //会改变原数组
fmt.Println(a)
fmt.Println(s1, len(s1), cap(s1)) //[0 1 2 3 4 10] 6 10
fmt.Println(s2, len(s2), cap(s2)) //[10 6 7 8 9] 5 5
}