1.slice 是一个引用类型,也是一个结构体
两种方法创建
(1)直接引用存在的数组,
(2)make是创建的数组,由切片在底层维护
2.append底层操作
slice append底层操作:
(1)先创建一个新数组,进行扩容,初始化为默认值
(2)不能在先前的数组上操作,将之前切片的值复制过来。
(3)如果将append之后的返回值赋值给之前的变量,那么指针指向新的地址,之前的切片将会被当成垃圾进行回收
(4)否则,两个内存共存。
package main
import (
"fmt"
)
func main() {
var arr []int = make([]int, 5)
for i := 0; i < 5; i++ {
arr[i] = i
} // 初始化切片
fmt.Println(arr)
arr = append(arr,6, 7, 8) // 此时并不是给arr新增内存,而是重新开辟一块大的空间,将之前的值复制过来,然后arr重新指向新的地址,之前的内存当成垃圾进行回收
fmt.Println(arr)
arr1 := append(arr, 4, 5, 6) // 此时和上面一样,只是arr没有改变。
fmt.Println(arr1)
}
3.拷贝操作只有切片类型才可以拷贝
拷贝后两块空间独立
package main
import (
"fmt"
)
func main() {
var arr []int = make([]int, 5)
for i := 0; i < 5; i++ {
arr[i] = i
} // 初始化切片
copy(arr2, arr)
fmt.Println(arr2)
}
4.切片在函数中是引用传递