- 切片
- 声明切片的方法
- 从数组中生成切片
- 初始化切片
- 直接声明切片并进行make初始化操作
- 为切片添加元素
- 对切片的操作也会影响产生它的数组随之进行变化
- 通过切片删除元素
- 遍历切片
- 总结
切片(slice)表示多个同类型元素的连续集合,但是切片本身并不存储任何元素,而只是对现有数组的引用。
切片结构包括:地址、长度和容量。
切片主要有三种生成方式:
- 从数组生成一个新的切片;
- 从切片生成一个新的切片;
- 直接生成一个新的切片。
这里的切片类似于 python中的切片的概念 ,使用格式为
1. 数组[开始位置:结束位置] 2. 切片[开始位置:结束位置] 3. var 切片变量名 []元素类型 4. var 切片变量名 []元素类型 切片变量名 = make([]元素类型,切片长度,切片容量)从数组中生成切片
package main
import "fmt"
func main() {
var arr = [...]string{"a", "b", "c", "d"} // 数组声明
fmt.Println(arr)
var arr_slice = arr[1:3] // 数组的切片
fmt.Println(arr_slice) // 数组的切片
fmt.Println(arr_slice[0]) // 切片的第0个元素
fmt.Println(&arr_slice[0]) // 切片第0个元素的地址
fmt.Println(len(arr_slice)) // 切片长度
fmt.Println(cap(arr_slice)) // 切片容量
}
初始化切片
在声明切片的同时进行初始化赋值,这个步骤和数组一模一样,所以,切片和数组是相通的。
package main
import "fmt"
func main() {
var arr_slice = []int{1, 2, 3, 4, 5}
fmt.Println("切片: ", arr_slice)
fmt.Println("切片长度: ", len(arr_slice))
fmt.Println("切片容量: ", cap(arr_slice))
fmt.Println("判断切片是否为空: ", arr_slice == nil)
}
// 切片: [1 2 3 4 5]
// 切片长度: 5
// 切片容量: 5
// 判断切片是否为空: false
直接声明切片并进行make初始化操作
本案例说明切片本身不具备数值,初始化之后也为0值,初始化确定的是切片的类型、切片的长度、切片的容量 。
package main
import "fmt"
func main() {
var arr_slice []int
arr_slice = make([]int, 2, 10)
fmt.Println("切片: ", arr_slice)
fmt.Println("切片长度: ", len(arr_slice))
fmt.Println("切片容量: ", cap(arr_slice))
fmt.Println("判断切片是否为空: ", arr_slice == nil)
}
// 切片: [0 0]
// 切片长度: 2
// 切片容量: 10
// 判断切片是否为空: false
写法2 :
package main
import (
"fmt"
)
func main() {
student := make([]int, 2, 5)
fmt.Print(student)
}
为切片添加元素
我们可以使用append()函数来对切片进行元素的添加。
注意:当切片不能再容纳其他元素时(即当前切片长度值等于容量值),下一次使用append()函数对切片进行元素添加,容量会按2倍数进行扩充。
举例:
package main
import (
"fmt"
)
func main() {
student := make([]int, 1, 1)
for i := 0; i < 8; i++ {
student = append(student, i)
fmt.Println("当前切片的长度为: ", len(student),
"当前的容量为: ", cap(student), "当前的切片值为: ", student)
}
}
// 当前切片的长度为: 2 当前的容量为: 2 当前的切片值为: [0 0]
// 当前切片的长度为: 3 当前的容量为: 4 当前的切片值为: [0 0 1]
// 当前切片的长度为: 4 当前的容量为: 4 当前的切片值为: [0 0 1 2]
// 当前切片的长度为: 5 当前的容量为: 8 当前的切片值为: [0 0 1 2 3]
// 当前切片的长度为: 6 当前的容量为: 8 当前的切片值为: [0 0 1 2 3 4]
// 当前切片的长度为: 7 当前的容量为: 8 当前的切片值为: [0 0 1 2 3 4 5]
// 当前切片的长度为: 8 当前的容量为: 8 当前的切片值为: [0 0 1 2 3 4 5 6]
// 当前切片的长度为: 9 当前的容量为: 16 当前的切片值为: [0 0 1 2 3 4 5 6 7]
对切片的操作也会影响产生它的数组随之进行变化
如果切片是从其他数组或切片生成,新切片的元素添加需要考虑对原有数组或切片中数据的影响。
package main
import "fmt"
func main() {
var student = [...]string{"Tom", "Ben", "peter"}
var student1 = student[0:1]
fmt.Println("student数组: ", student)
fmt.Println("student1切片: ", student1)
student1 = append(student1, "Danny")
fmt.Println("扩充Danny后的student1切片: ", student1,
" 切片长度为: ", len(student1),
" 切片容量为: ", cap(student1))
fmt.Println("扩充Danny后的student数组: ", student)
}
// student数组: [Tom Ben peter]
// student1切片: [Tom]
// 扩充Danny后的student1切片: [Tom Danny] 切片长度为: 2 切片容量为: 3
// 扩充Danny后的student数组: [Tom Danny peter]
通过切片删除元素
需要我们手动将删除点前后的元素连接起来,从而实现对切片中元素的删除。
package main
import "fmt"
func main() {
var student = []string{"Tom", "Ben", "DROP", "peter"}
student = append(student[:2], student[3:]...)
fmt.Println(student)
}
遍历切片
切片的遍历和数组类似,可以通过切片下标来进行遍历。切片下标同样从0开始,第一个元素的数组下标为0,第二个元素的数组下标为1,以此类推。
package main
import "fmt"
func main() {
var student = []string{"Tom", "Ben", "DROP", "peter"}
for k, v := range student {
fmt.Println("k = ", k, " ", "v = ", v)
}
}
总结
-
切片表示多个同类型元素的连续集合,但是切片本身并不存储任何元素,而只是对现有数组的引用。
-
如果切片是从其他数组或切片生成,新切片的元素添加需要考虑对原有数组或切片中数据的影响。
-
Go语言没有为删除切片元素提供方法,所以需要我们手动将删除点前后的元素连接起来,从而实现对切片中元素的删除。



