首先我们应该知道go没有引用类型只有值类型。
那么切片可以理解为一个指针类型,切片的参数传递就是指针的值传递
sli := []int{0,1,2,3,4}
追加操作
追加操作返回的切片的内存地址,可能不是原来的地址,所以append操作是需要返回值的。
这个涉及到追加之后的扩容问题了。有点类似于C++ vector的扩容过程
sli = append(sli, 100)
初始化
初始化一个大内存,但是不生成元素
sli := make([]int, 0, 1000)/// len =0 cap= 1000
初始化一个大容量,之后调用append的操作,不超过容量的大小,就不会重新分配内存,这个有点类似于C++vector的reserve操作,还是比较有用的,防止内存多次分配和数据交换。
初始化一个固定长度的切片
sli := make([]int, 10) ///长度10 cap 10 内容全是0
初始化另一个切片,相当于指针赋值操作,指向的内存是一致的
sli1 := sli /// 两者指向的内存一致
删除元素
/// 删除下表为 i 的元素
sli = append(sli[:i] , sli[i+1:]...)
/// 删除头元素
sli = sli[1:]
/// 删除尾元素
sli = sli[:len(sli) -1]
清空切片
sli = nil
访问头元素
ele := sli[0]
访问尾元素
ele := sli[len(sli) - 1]
切片值是nil的时候,可以获取长度
var data []string = nil
if len(data) <= 0 {
/// OK
}
var data *string = nil
if len(data) <= 0 {
/// Error
}
深拷贝
data := []int{1,2,3,4}
data2 := make([]int, len(data))
copy(data2, data)