切片Slice
- 其本身并不是数组,它指向底层的数组
- 作为变长数组的替代方案,可以关联底层数组的局部或全部
为引用类型 - 可以直接创建或从底层数组获取生成
- 使用len()获取元素个数,cap()获取容量
- 一般使用make()创建
如果多个slice指向相同底层数组,其中一个的值改变会影响全部
make([]T,len,cap)
- 其中cap可以省略,则和len的值相同
- len表示存数的元素个数,cap表示容量
- package main
-
- import (
- "fmt"
- )
-
- func main() {
- //空的slice
- var s1 []int
- fmt.Println(s1)
- //创建一个数组
- a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
- fmt.Println(a)
- //获取索引从5到9的元素
- s2 := a[5:10] //包含开始索引,不包含结束索引
- fmt.Println(s2)
- //获取第七个以后所有的元素
- s3 := a[7:]
- fmt.Println(s3)
- //获取刚开始的前三个元素
- s4 := a[:3]
- fmt.Println(s4)
- //获取数组的所有元素 等价于 =
- s5 := a[:]
- s6 := a
- fmt.Println(s5)
- fmt.Println(s6)
- }
- package main
-
- import (
- "fmt"
- )
-
- func main() {
- //表示此切片初始容量为3,
- //可以容纳为10
- //如果超过10就会自动扩容+10
- s1 := make([]int, 10)
- fmt.Println(s1)
- fmt.Println(len(s1),cap(s1))
-
- a := []byte{'a','b','c','d','.','w','r','v','4','3','2'}
- s2 := a[2:4]
- fmt.Println(string(s2))
- }
Reslice
- Reslice时索引以被slice的切片为准
- 索引不可以超过被slice的切片的容量cap()值
- 索引越界不会导致底层数组的重新分配而是引发错误
- package main
-
- import (
- "fmt"
- )
-
- func main() {
-
- a := []byte{'a','2'}
- s2 := a[2:4]
- s3 := s2[1:2]
- s4 := s2[1:8]
- fmt.Println(string(s2))
- fmt.Println(string(s3))
- fmt.Println(string(s4))
- }
Append
- 可以在slice尾部追加元素
- 可以将一个slice追加在另一个slice尾部
- 如果最终长度未超过追加到slice的容量则返回原始slice
- 如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据
- package main
-
- import (
- "fmt"
- )
-
- func main() {
-
- s1 := make([]int, 6)
- fmt.Printf("%p\n",s1)
- s1 = append(s1, 1, 3)
- fmt.Printf("%v %p\n",s1,s1)
- }
- package main
-
- import (
- "fmt"
- )
-
- func main() {
-
- a := []int{1, 5}
- fmt.Println(a)
- //指向底层的数组
- s1 := a[2:5]
- s2 := a[1:3]
- s3 := a[1:3]
-
- fmt.Println(s1,s2)
- //如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据
- s3 = append(s3, 1)
- //更改元素后,底层数组相应的也会更改
- s1[0] = 9
- fmt.Println(s1,s2)
- fmt.Println(s3)
- fmt.Println(a)
- }
Copy
- package main
-
- import (
- "fmt"
- )
-
- func main() {
-
- s1 := []int{1, 6}
- s2 := []int{7, 9}
- s3 := []int{7, 9}
-
- copy(s2,s1)
- copy(s1,s3)
- fmt.Println(s2)
- fmt.Println(s1)
-
- }
- package main
-
- import (
- "fmt"
- )
-
- func main() {
-
- s1 := []int{1, 10, 11}
-
- copy(s2[2:4],s1[4:6])
- fmt.Println(s2)
- }