什么是 slice
对数据的抽象,不带长度的数组,动态数组,可以追加元素
一种方便,灵活强大的容器,切片本身没有任何数据,它们只是对现有数组的引用。
在概念上讲,slice像一个结构体,包括三个元素
- 指针
- 长度
- 最大长度(容量)
定义
var identifier []type
如何操作
创建
var slice1 []type = make([]type, len)
slice1 := make([]type, len)
make([]T, length, cap)
添加元素
使用 append 向 slice 中添加元素
slice = append(slice, elem1, elem2)
slice = append(slice, anotherSlice...)
遍历
for i:=0; i<len(slice); i++ {
fmt.Println(slice[i])
}
for i, v := range slice {
fmt.Println(i, "->", v)
}
slice内存分析与扩容
向slice中添加元素,
- 本次添加没有超过 slice 容量,直接添加
本次添加超过 slice容量
- 底层建立新数组(原底层数据容量2倍)
- 复制旧数组元素 ——> 新数组
slice 指针指向新数组 ```go func main() { s1 := []int{1, 2, 3} fmt.Println(s1) // [1 2 3] fmt.Printf(“len: %d, cap: %d\n”, len(s1), cap(s1)) // len: 3, cap: 3 fmt.Printf(“%p\n”, s1) // 0xc00000a400
s1 = append(s1, 4, 5) fmt.Println(s1) // [1 2 3 4 5] fmt.Printf(“len: %d, cap: %d\n”, len(s1), cap(s1)) // len: 5, cap: 6 fmt.Printf(“%p\n”, s1) //0xc00000c2d0
}
<a name="I7Obi"></a>
## 根据数据创建slice
<a name="bUAHA"></a>
## 深copy和浅copy
什么是深copy和浅copy
- 深copy: 拷贝的数据本身
- 值类型的数据, 默认都是深copy: arry, int, float, string, bool, struct
- 浅copy: 拷贝的数据地址(指针)
- 引用类型的数据,默认都是浅copy: slice, map
<a name="u6U7x"></a>
### slice 的深copy
1. 循环copy到新slice
1. 使用内置 copy 函数
<a name="guKoN"></a>
### copy函数
函数签名
```go
func copy(dst, src []Type) int
The copy built-in function copies elements from a source slice into a destination slice. (As a special case, it also will copy bytes from a string to a slice of bytes.) The source and destination may overlap. Copy returns the number of elements copied, which will be the minimum of len(src) and len(dst).
内建函数,copy元素从一个源slice -> 目标 slice