概念:
数组的动态初始化:
动态初始化&静态初始化:
切片的创建:
普通格式:
var 切片名 [] 数据类型
自动推导类型创建切片:
切片名 := [] 类型{}
make函数创建切片:
长度是已经初始化的空间,容量是已经开辟的空间,包括已经初始化的空间和空闲的空间
// 长度是不能大于容量的,容量可以省略不写,不写时候就默认和长度的值一样
切片名称 := make ([]切片类型,长度 容量)
// 返回切片的容量使用cap,返回切片的长度使用len
fmt.Println(cap(切片名称))
演示:
func SliceDemo01() {
//var slice [] int
//slice := [] int{}
slice := make([]int, 3, 4)
fmt.Println("切片中的数据", slice)
fmt.Println("切片长度:", len(slice))
fmt.Println("切片容量:", cap(slice))
}
切片初始化:
初始化格式:
/// 普通格式创建的切片
切片名 [索引] = 值
// 自动推导类型创建的切片
切片名 := [] 类型{数据1,数据2,数据3}
// make函数方式创建的切片可以通过append和循环初始化
切片名称 = append(切片名称, 数据1,数据2...)
演示:
func SliceDemo2() {
var slice []int
slice = append(slice, 1, 2, 3, 4)
slice[1] = 111
fmt.Println("切片中的数据", slice)
fmt.Println("可以通过索引取部分数据", slice[0])
fmt.Println("切片长度:", len(slice))
}
func SliceDemo03() {
slice := []int{1, 2, 3, 4, 5}
slice = append(slice, 6, 7, 8, 9, 10)
slice[1] = 111
fmt.Println("切片中的数据", slice)
fmt.Println("可以通过索引取部分数据", slice[0])
fmt.Println("切片长度:", len(slice))
}
func SliceDemo04() {
slice := make([]int, 3, 4)
for i := 0; i < len(slice); i++ {
slice[i] = i + 1
}
slice = append(slice, 1)
fmt.Println("切片中的数据", slice)
fmt.Println("可以通过索引取部分数据", slice[0])
fmt.Println("切片长度:", len(slice))
fmt.Println("切片容量:", cap(slice))
}
切片遍历:
演示:
func SliceDemo05() {
slice := []int{1, 2, 3, 4, 5}
for i := 0; i < len(slice); i++ {
fmt.Print(slice[i])
}
for _, v := range slice {
fmt.Println(v)
}
}
切片截取:
切片截取的操作:
操作 | 含义 |
---|---|
s[n] | 切片s中索引位置为n的项 |
s[:] | 从切片s的索引位置0到len(s)-1处所获得的切片 |
s[low:] | 从切片s的索引位置low到len(s)-1处所获得的切片 |
s[:high] | 从切片s的索引位置0到high处所获得的切片,len=high |
s[low:high] | 从切片s的索引位置low到high处所获得的切片,len=high-low |
s[low:high:max] | 从切片s的索引位置low到high处所获得的切片,len=high-low,cap=max-low |
len(s) | 切片s的长度,总是<=cap(s) |
cap(s) | 切片s的容量,总是>=len(s) |
演示:
func SliceDemo05() {
slice := []int{1, 2, 3, 4, 5}
/**
第一个值:截取的起始索引
第二个值:截取的终止索引(不包括该值)
第三个值:用来计算切片的容量,可以省略,默认和长度一样
容量 = 第三个值 - 第一个值
长度 = 第二个值 - 第一个值
*/
newSlice := slice[0:3:3]
fmt.Println("截取后的切片", newSlice)
fmt.Println("切片的长度", len(newSlice))
fmt.Println("切片的容量", cap(newSlice))
// 和复制一样了
newSlice2 := slice[:]
fmt.Println("截取后的切片", newSlice2)
fmt.Println("切片的长度", len(newSlice2))
fmt.Println("切片的容量", cap(newSlice2))
}
切片值的修改:
原因:
演示:
func SliceDemo06() {
slice := []int{1, 2, 3, 4, 5}
newSlice2 := slice[0:3]
fmt.Println("切片修改前slice的数据:", slice) // [1 2 3 4 5]
newSlice2[0] = 1111
fmt.Println("切片修改后slice的数据:", slice) //[1111 2 3 4 5]
}
append函数:
func SliceDemo07() {
slice := make([]int, 3, 4)
// 这里定义了切片的长度是3,初始容量是4,系统会对长度赋上默认值,int类型就是0,所以打印3个0
fmt.Println(slice) // [0 0 0]
slice = append(slice, 1)
// 添加数据,此时容量是4,数据已经有4个了,如果继续多加点数据,会不会报错
fmt.Println("第一次添加数据:", slice) // [0 0 0 1]
slice = append(slice, 2, 3, 4, 5, 6, 7, 8, 9)
fmt.Println("第二次添加数据:", slice) // [0 0 0 1 2 3 4 5 6 7 8 9]
}
copy函数:
格式:
copy(切片1,切片2)
演示:
// 从切片2复制到切片1,但是切片2的数据比切片1的多,所以,最终只是复制了一部分,也就是索引相对应的数据
func SliceDemo08() {
slice := []int{1, 2, 3}
slice2 := []int{4, 5, 6, 7, 8, 9}
copy(slice, slice2)
fmt.Println(slice) // [4 5 6]
}
// 从切片1复制到切片1,但是切片1的数据比切片2的少,所以,最终只是复制了一部分,也就是索引相对应的数据
func SliceDemo09() {
slice := []int{1, 2, 3}
slice2 := []int{4, 5, 6, 7, 8, 9}
copy(slice2, slice)
fmt.Println(slice2) // [1 2 3 7 8 9]
}
切片作为函数参数:
演示:
func main() {
//SliceDemo01()
slice := []int{1, 2, 3, 4, 5}
SliceDemo10(slice)
}
func SliceDemo10(slice []int) {
for _, v := range slice {
fmt.Println(v)
}
slice = append(slice, 5, 6, 7)
fmt.Println(slice) //[1 2 3 4 5 5 6 7]
}
切片求和:
func main() {
// 定义变量,并收集用户输入的个数
var count int
fmt.Println("请输入要求和的个数:")
fmt.Scan(&count)
// 定义切片,将输入的个数保存到切片
slice := make([]int, count)
statisticalData(slice)
// 求和
summation(slice)
}
func statisticalData(slice []int) {
for i := 0; i < len(slice); i++ {
fmt.Printf("请输入第%d个数\n", i+1)
fmt.Scan(&slice[i])
}
}
func summation(slice []int) {
var sum int
for i := 0; i < len(slice); i++ {
sum += slice[i]
}
fmt.Println("和为:", sum)
}
切片求最大值:
func main() {
// 定义变量,并收集用户输入的个数
var count int
fmt.Println("请输入要比较的数:")
fmt.Scan(&count)
// 定义切片,将输入的个数保存到切片
slice := make([]int, count)
statisticalData(slice)
// 比较最大值
maximum(slice)
}
func statisticalData(slice []int) {
for i := 0; i < len(slice); i++ {
fmt.Printf("请输入第%d个数\n", i+1)
fmt.Scan(&slice[i])
}
}
func maximum(slice []int) {
max := slice[0]
for i := 0; i < len(slice); i++ {
if max < slice[i] {
max = slice[i]
}
}
fmt.Println("最大值是:", max)
}