> 可以理解为动态数组。切片是引用调用,传指针,访问和遍历与数组一致。slice的元素地址指向数组对应元素的地址。slice从底层来讲,是一个数据结构struct
`var a []int//不确定长度的int类型切片`
```
package main
import (
"fmt"
)
func main() {
var intArr [5]int = [...]int{1, 22, 33, 66, 99}
slice := intArr[1:3] //引用1->3,不包含3
fmt.Println("slice的元素", slice)
fmt.Println("slice的元素个数", len(slice))
fmt.Println("slice的容量", cap(slice)) //切片的容量是可以动态变化的
for index, value := range slice {
fmt.Printf("下标是%v 值为%v\\n", index, value)
}
}
```
![](https://img.kancloud.cn/71/16/7116bd37257077d3e375c3cb336b84c4_232x109.png)
> 切片的使用方式
1. 定义一个切片,让切片去引用一个创建好的数组。直接引用数组,数组事先存在,程序员是可见的
2. 通过make来创建切片 `var 切片名 []type([],len,[cap])` `var slice []int = make([]int,4,10)` type 数据类型 len 大小 cap 容量。由切片在底层进行维护,程序员不可见
3. 指定具体数组,原理类似make `var slice []int = []int {1,3,4}`
![](https://img.kancloud.cn/d0/e0/d0e0312faacee17cabe7d119d0ed4b5d_875x297.png)
> 相关函数库builtin
append:内建函数append将元素追加到切片的末尾。若它有足够的容量,其目标就会重新切片以容纳新的元素。否则,就会分配一个新的基本数组。append返回更新后的切片,因此必须存储追加后的结果。
```
slice = append(slice,elem1,elem2)
```
![](https://img.kancloud.cn/ac/63/ac638ee7e090fbaf2a506e84e6353719_1093x337.png)
copy:内建函数copy将元素从来源切片复制到目标切片中,也能将字节从字符串复制到字节切片中。copy返回被复制的元素数量,它会是 len(src) 和 len(dst) 中较小的那个。来源和目标的底层内存可以重叠
copy(目标slice,来源slice)
目标slice长度小于来源slice,不报错
![](https://img.kancloud.cn/72/07/72075897b707aad09b2140ac2c98b689_981x244.png)
- 数据类型
- 数组array
- 切片slice
- 字符串string
- map
- 结构体struct
- 方法func
- 匿名结构体(继承)
- 字段别名
- 接口interface
- 常量
- 基础语法
- 循环for
- 遍历
- 函数func
- defer
- 异常处理error
- 访问范围
- 包
- 类型断言
- 文件
- 打开文件
- 读取文件
- 写文件
- 判断是否存在
- 拷贝文件
- JSON
- 序列化
- 反序列化
- 命令行
- 杂项
- Windows下配置加速
- 相关链接
- 占位符
- 随机数rand
- 单元测试
- goroutine
- 并发和并行
- 协程和主线程
- MPG模式
- 设置CPU数量
- 全局互斥锁
- 管道
- 示例1
- 示例2
- select
- 异常捕获
- 反射
- 示例
- 示例-改变值
- 网络编程
- TCP编程
- 示例一
- redis