go 语言学习笔记⑥----切片
通过内部指针和相关属性,引用数组片段,以实现变长方案。
go中数据结构, 我们可以增加更多的值
声明
arr := [...]int{1, 2, 3, 4, 5, 6}
slice := arr[0:3:5]
数组[起始位置:终止位置:max] (左闭右开)
长度= 终止 - 起始
容量= max - 起始
函数
len()长度
cap()容量
arr := [10]int{1, 2, 3, 4, 5, 6}
slice := arr[0:3:5]
fmt.Println(len(slice), cap(slice), slice)
结果:3 5 [1 2 3]
切片与数组区别
数组声明**[]中的长度为固定的一个常量, 数组不能修改长度 len == cap
切片[]可以为空或者为…**长度和容量可以不固定
arr := []int{1, 2, 3, 4, 5, 6}
自动初始化
make函数
arr := make([]int, 10, 10)
切片变量 := mak([]切片类型,len , cap)
截取
方法 | 作用 |
---|---|
s[n] | 切片索引n位置的值 |
s[:] | 切片索引从0到len(s) - 1的切片 |
s[low:] | 切片索引从low到最后的切片 |
s[:high] | 切片索引从0到high的切片 |
s[low:high:max] | 切片索引从low到high的切片(容量为max - low) |
package main
import (
"fmt"
)
func main() {
a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println(a[2])
b1 := a[:]
fmt.Println(b1)
b2 := a[3:]
fmt.Println(b2)
b3 := a[:5]
fmt.Println(b3)
b4 := a[3:5]
fmt.Println(b4)
b5 := a[3:6:9]
fmt.Println(b2, len(b5), cap((b5)))
}
结果
3
[1 2 3 4 5 6 7 8 9]
[4 5 6 7 8 9]
[1 2 3 4 5]
[4 5]
[4 5 6 7 8 9] 3 6
append函数
在末尾加新成员
package main
import (
"fmt"
)
func main() {
arr := [10]int{1, 2, 3, 4, 5, 6}
slice := arr[0:3:5]
fmt.Println(len(slice), cap(slice), slice)
slice = append(slice, 1)
fmt.Println(slice)
fmt.Println(arr)
}
结果
3 5 [1 2 3]
[1 2 3 1]
[1 2 3 1 5 6 0 0 0 0]
改变切片也会改变原数组
如果切片容量不够, 扩容两倍容量
package main
import (
"fmt"
)
func main() {
a := []int{}
for i := 0; i <= 16; i++ {
a = append(a, i)
fmt.Println(a, len(a), cap(a))
}
}
结果
[0] 1 1
[0 1] 2 2
[0 1 2] 3 4
[0 1 2 3] 4 4
[0 1 2 3 4] 5 8
[0 1 2 3 4 5] 6 8
[0 1 2 3 4 5 6] 7 8
[0 1 2 3 4 5 6 7] 8 8
[0 1 2 3 4 5 6 7 8] 9 16
[0 1 2 3 4 5 6 7 8 9] 10 16
[0 1 2 3 4 5 6 7 8 9 10] 11 16
[0 1 2 3 4 5 6 7 8 9 10 11] 12 16
[0 1 2 3 4 5 6 7 8 9 10 11 12] 13 16
[0 1 2 3 4 5 6 7 8 9 10 11 12 13] 14 16
[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] 15 16
[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15] 16 16
[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16] 17 32
copy
copy(目的, 原来)
package main
import (
"fmt"
)
func main() {
a := []int{1, 2, 3, 4}
b := []int{5, 6, 7}
copy(a, b)
fmt.Println(a, b)
a[1] = 12
b[2] = 18
fmt.Println(a, b)
}
结果
[5 6 7 4] [5 6 7]
[5 12 7 4] [5 6 18]
做函数参数
package main
import (
"fmt"
)
func addV(a []int) {
for i := 1; i <= 5; i++ {
a[i] = i
}
}
func main() {
a := make([]int, 10)
addV(a)
fmt.Println(a)
}
//[0 1 2 3 4 5 0 0 0 0]