slice切片
- 其本身并不是数组,它指向底层的数组
- 作为变长数组的替代方案,可以关联底层数组的局部或全部
- 类型为引用类型
- 可以直接创建或从底层数组获取生成
- 使用len() 获取元素个数, cap() 获取容量
- 一般使用make() 创建
- 如果多个slice指向相同底层数组,其中一个的值改变会影响全部
- make([]T,len,cap)
- 其中cap可以省略,则和len的值相同
- len表示存数的元素个数,cap表示容量
- Reslice 时索引以被slice的切片为准
- 索引不可以超过被slice的切片的容量cap()值
- 索引月切不会导致底层数组的重新分配而是引发错误
- 可以在slice尾部追加元素
- 可以将一个slice追加在另一个slice尾部
- 如果最终长度未超过追加到slice的容量则返回原始slice
- 如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据
- 示例代码:
package main
import (
"fmt"
)
func main() {
test1()
test2()
test3()
test4()
test5()
test6()
test7()
test8()
test9()
test10()
test11()
}
func test1() {
var s1 []int
fmt.Println(s1)
}
func test2() {
a := [5]int{1,2,3,4,5}
fmt.Println(a)
s1 := a[2]
fmt.Println(s1)
s2 := a[4:5]
s3 := a[4:len(a)]
s4 := a[4:]
fmt.Println(s2)
fmt.Println(s3)
fmt.Println(s4)
}
func test3() {
a := [5]int{1,2,3,4,5}
fmt.Println(a)
s1 := a[:3]
fmt.Println(s1)
}
func test4() {
s1 := make([]int, 3, 5)
fmt.Println(s1)
fmt.Println(len(s1),cap(s1))
}
func test5() {
a := []byte{'a','b','c','d','e','f','g','h','i','j'}
b := string(a[2:5])
c := string(a[3:5])
fmt.Println(b)
fmt.Println(c)
}
func test6() {
s1 := make([]int, 3, 6)
fmt.Printf("%p\n", s1)
s1 = append(s1,1,2,3)
fmt.Printf("%v %p\n", s1, s1) // [0 0 0 1 2 3] 0xc042047f50 // 此处表明,在未超过最大容量候,操作的都是同一个地址
s1 = append(s1,1,2,3)
fmt.Println("cap:", cap(s1))
fmt.Printf("%v %p\n", s1, s1)
}
func test7() {
a := []int{1,2,3,4,5}
s1 := a[2:5]
s2 := a[1:3]
fmt.Println(s1, s2)
s1[0] = 9
fmt.Println(s1, s2)
}
func test8() {
a := []int{1,2,3,4,5}
s1 := a[2:5]
s2 := a[1:3]
fmt.Println(s1, s2)
fmt.Println(len(s2),cap(s2))
s2 = append(s2, 1,1,1)
s1[0] = 9
fmt.Println(s1, s2)
}
func test9() {
s1 := []int{1,2,3,4,5,6}
s2 := []int{7,8,9}
copy(s1,s2)
fmt.Println(s1)
}
func test10() {
s1 := []int{1,2,3,4,5,6}
s2 := []int{7,8,9}
copy(s2,s1)
fmt.Println(s2)
}
func test11() {
s1 := []int{1,2,3,4,5,6}
s2 := []int {7,8,9,10,1,1,1,1,1}
copy(s2[2:4], s1[1:3])
fmt.Println(s2)
}