### 切片
> **slice [开始位置:结束位置]**
> len() 获取当前切片长度(实际存在元素个数),cap()函数获取当前切片容量(起始元素开始到底层数组中最后一个元素的个数),& 获取地址(内存地址)
```
package main
import "fmt"
func main() {
var student = [...]string{"Tom", "Ben", "Peter"}
var student1 = student[1:2]
var student2 = student[:]
fmt.Println("student数组", student)
// student数组 [Tom Ben Peter]
fmt.Println("student1切片", student1)
//student1切片 [Ben]
fmt.Println("student2切片", student2)
// student1切片 [Tom Ben Peter]
fmt.Println("student[1]的地址", &student[1])
// student[1]的地址 0xc000076490
fmt.Println("student1[0]的地址", &student1[0])
// student1[0]的地址 0xc000076490
fmt.Println("student1切片长度", len(student1))
// student1切片长度 1
fmt.Println("student1切片容量", cap(student1))
// student1切片容量 2
}
```
### 声明切片
> **var 切片变量名 []元素类型**
```
package main
import "fmt"
func main() {
var student []int
fmt.Println("student切片", student)
fmt.Println("student切片长度", len(student))
fmt.Println("student切片容量", cap(student))
fmt.Println("判断student切片是否为空", student == nil)
}
结果:
student切片 []
student切片长度 0
student切片容量 0
判断student切片是否为空 true
```
### 初始化切片
> **make([]元素类型, 切片长度, 切片容量)**
> **make([]元素类型, 长度容量一样)**
> 容量必须大于长度
> 或者使用赋值的方法初始化
```
package main
import "fmt"
func main() {
var student []int
student = make([]int, 2, 10)
fmt.Println("student切片", student)
fmt.Println("student切片长度", len(student))
fmt.Println("student切片容量", cap(student))
fmt.Println("判断student切片是否为空", student == nil)
}
结果:
student切片 [0 0]
student切片长度 2
student切片容量 10
判断student切片是否为空 false
```
```
package main
import "fmt"
func main() {
var student = []int{1, 2}
fmt.Println("student切片", student)
fmt.Println("student切片长度", len(student))
fmt.Println("student切片容量", cap(student))
fmt.Println("判断student切片是否为空", student == nil)
}
结果:
student切片 [1 2]
student切片长度 2
student切片容量 2
判断student切片是否为空 false
```
### 为切片添加元素
> **使用append()函数添加元素,当切片长度等于容量值时(不能容纳其他元素),再次使用appedn()添加元素,容量会按照2倍数扩充**
```
package main
import "fmt"
func main() {
student := make([]int, 0, 1)
fmt.Println("添加前student切片", student)
for i := 0; i < 5; i++ {
student = append(student, i)
fmt.Println("当前切片长度", len(student), "当前切片容量", cap(student))
}
fmt.Println("添加后student切片", student)
var str = [...]string{"Tom", "Ben", "Peter"}
str1 := str[0:1]
fmt.Println("str数组", str)
fmt.Println("str1切片", str1)
str1 = append(str1, "Pony") //添加的元素会覆盖原数组位置元素
fmt.Println("添加Pony后str1切片,长度,容量", str1, len(str1), cap(str1))
fmt.Println("添加Pony后的str数组", str)
}
结果:
添加前student切片 []
当前切片长度 1 当前切片容量 1
当前切片长度 2 当前切片容量 2
当前切片长度 3 当前切片容量 4
当前切片长度 4 当前切片容量 4
当前切片长度 5 当前切片容量 8
添加后student切片 [0 1 2 3 4]
str数组 [Tom Ben Peter]
str1切片 [Tom]
添加Pony后str1切片,长度,容量 [Tom Pony] 2 3
添加Pony后的str数组 [Tom Pony Peter]
```
### 从切片中删除元素
> **Go语言没有删除切片元素的方法,需要手动将删除点前后元素连接起来**
```
package main
import "fmt"
func main() {
var student = []string{"Tom", "Ben", "Peter", "John"}
fmt.Println("删除Ben前,长度,容量", student, len(student), cap(student))
student = append(student[0:1], student[2:]...)
//等价于 student = append(student[0:1], student[2], student[3])
fmt.Println("删除Ben后,长度,容量", student, len(student), cap(student))
student = student[0:0]
fmt.Println("清空后,长度,容量", student, len(student), cap(student))
}
结果:
删除Ben前,长度,容量 [Tom Ben Peter John] 4 4
删除Ben后,长度,容量 [Tom Peter John] 3 4
清空后,长度,容量 [] 0 4
```
### 遍历切片
> **遍历切片的方法 类似于遍历数组。k是索引,v是切片副本元素**
```
for k,v := range 容器变量{
fmt.Println("索引",k,"元素",v)
}
```
```
package main
import "fmt"
func main() {
var student = []string{"Tom", "Ben", "Peter", "John"}
for k, v := range student {
fmt.Println("索引", k, "元素", v)
}
}
结果:
索引 0 元素 Tom
索引 1 元素 Ben
索引 2 元素 Peter
索引 3 元素 John
```
- 安装开发环境
- 安装开发环境
- 安装详细教程
- 引入包
- Go语言基础
- 基本变量与数据类型
- 变量
- 数据类型
- 指针
- 字符串
- 代码总结
- 常量与运算符
- 常量
- 运算符
- 流程控制
- if判断
- for循环
- switch分支
- goto跳转
- 斐波那契数列
- Go语言内置容器
- 数组
- 切片
- 映射
- 函数
- 函数(上)
- 函数(中)
- 函数(下)
- 小节
- 包管理
- 结构体
- 结构体(上)
- 结构体(中)
- 结构体(下)
- 小节
- 错误处理
- 错误处理
- 宕机
- 错误应用
- 小节
- 文件操作
- 获取目录
- 创建和删除目录
- 文件基本操作(上)
- 文件基本操作(中)
- 文件基本操作(下)
- 处理JSON文件
- 接口与类型
- 接口的创建与实现
- 接口赋值
- 接口嵌入
- 空接口
- 类型断言(1)
- 类型断言(2)
- 小节
- 并发与通道
- goroutine协程
- runtime包
- 通道channel
- 单向通道channel
- select
- 线程同步
- 多线程的深入学习
- http编程
- http简介
- Client和Request
- get请求
- post请求
- 模块函数方法
- 模块
- fmt库,模块
- 项目练习
- 爬虫:高三网
- 爬虫:快代理
- 爬虫:快代理2
- 多线程:通道思路
- 多线程爬虫:快代理