数组和切片的区别:
数组长度等义之后无法再次修改,数组是值类型
切片并不是数组或数组指针
定义
定义一个未指定长度的数组来等义切片,切片不需要指定长度
var i []int
len(长度) cap(容量)
func main() {
s := []int{1, 2, 3, 4, 5}
v := s[0:3:5]
fmt.Println(s)
fmt.Println("len = ", len(v)) // 长度 3-0
fmt.Println("cap = ", cap(v)) // 容量 5-0
}
make
使用make来创建切片
make(切片类型, 长度, 容量)
func main() {
s := make([]int, 5, 10)
fmt.Println(s)
}
// 不指定容量
func main() {
s := make([]int, 5)
fmt.Println(s)
}
切片截取
func main() {
a := []int{1, 2, 3, 4, 5} // [1 2 3 4 5] 长度5 容量5
s1 := a[:] // [1 2 3 4 5] 长度5 容量5
s2 := a[1:] // [2 3 4 5] 长度4 容量4
s3 := a[:2] // [1 2] 长度2 容量5
s4 := a[1:3] // [2 3] 长度2 容量4
fmt.Println(s1, len(s1), cap(s1))
fmt.Println(s2, len(s2), cap(s2))
fmt.Println(s3, len(s3), cap(s3))
fmt.Println(s4, len(s4), cap(s4))
}
append
在元素的末尾添加元素,超过原来的容量通常以2倍扩容
s1 := []int{1}
s1 = append(s1, 2)
fmt.Println(s1) // 输出[1 2]
copy
func main() {
srcSlice := []int{1, 2}
dstSlice := []int{1, 1, 1, 1, 1}
copy(dstSlice, srcSlice)
fmt.Println(dstSlice) // 输出[1 2 1 1 1]
}