0
点赞
收藏
分享

微信扫一扫

Golang切片使用大全(创建、初始化、遍历、截取、修改、添加、切片的copy、切片作为函数参数、切片求和、切片求最大值)

概念:

数组的动态初始化:

动态初始化&静态初始化:

切片的创建:

普通格式:

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)
}
举报

相关推荐

0 条评论