Go:3-3 切片的操作(slice创建、append、copy、删除)

一.向lslice中添加元素(apend)

arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s1 := arr[2:6]
fmt.Println("s1=", s1)
s2 := s1[3:5]
fmt.Println("s2=", s2)
s3 := append(s2, 10)
fmt.Println("s3=", s3)
s4 := append(s3, 11)
fmt.Println("s4=", s4)
s5 := append(s4, 12)
fmt.Println("s5=", s5)
fmt.Println("arr=", arr)

结果:
在这里插入图片描述
分析:
s1结果没有问题,s2结果是因为slice扩展的原理。
s3结果将arr数组最后一位7替换为10。
s4和s5虽然已经添加了11、12,但是超过了数组长度,系统会分配一个更长的数组添加11、12。

因此:
1.添加元素时如果超越了cap,系统会重新分配更大的底层数组;
2.由于值传递的关系,必须接受append的返回值;s=append(s,val)

二.slice的创建

var s []int//创建slice,初始值为nil,s=nil

新创建的slice初始值为nil(nil就是null,只不过在go中时nil)。

初始化len和cap的创建

func printSlice(s []int) {
	fmt.Printf("len=%d,cap=%d\n", len(s), cap(s))
}
func main() {
	s1 := []int{2, 4, 6, 8} //len和cap为4,注意和数组初始化区别,数组初始化必须指定大小
	printSlice(s1)
	s2 := make([]int, 16) //创建slice,len和cap为16
	printSlice(s2)
	s3 := make([]int, 10, 32) //创建slice,len为10,cap为32
	printSlice(s3)
}

结果:
在这里插入图片描述

三.向slice中添加元素

var s []int //创建slice,初始值为nil,s=nil
for i := 0; i < 100; i++ {
	s = append(s, i)//添加
}
fmt.Println(s)

结果:
在这里插入图片描述

四.向slice中添加元素,len和cap变化

func printSlice(s []int) {
	fmt.Printf("len=%d,cap=%d\n", len(s), cap(s))
}
func main() {
	var s []int //创建slice,初始值为nil,s=nil
	for i := 0; i < 20; i++ {
		printSlice(s)
		s = append(s, i)
	}
	fmt.Println(s)
}

结果:len每次+1变换,cap每次是以2的平方扩充。
在这里插入图片描述

五.复制函数copy使用

s1 := []int{2, 4, 6, 8} //注意和数组初始化区别,数组初始化必须指定大小
s2 := make([]int, 16) //创建slice,len和cap为16
copy(s2, s1)//copy使用
fmt.Println(s2)

结果:
在这里插入图片描述

六.删除切片中间的元素

Go语言中没有自带的delete函数,但是可以使用切片本身性质左开右闭和append()函数实现。
注意:append(s,a)这里的a必须是常量,但是后面添加切片,需要添加“…”。

	s1 := []int{2, 4, 6, 8} //注意和数组初始化区别,数组初始化必须指定大小
	s2 := make([]int, 16) //创建slice,len和cap为16
	copy(s2, s1)
	fmt.Println(s2)
	printSlice(s2)
	s2 = append(s2[:3], s2[4:]...)
	fmt.Println(s2)
	printSlice(s2)

结果:
在这里插入图片描述

七.删除切片首元素和尾元素

s1 := []int{2, 4, 6, 8} //注意和数组初始化区别,数组初始化必须指定大小
s2 := make([]int, 16) //创建slice,len和cap为16
copy(s2, s1)
fmt.Println(s2)
printSlice(”s2=“s2)
fmt.Println("删除首元素")
font := s2[0] //用于接收首元素
s2 = s2[1:]
fmt.Println("首元素", font, ",去除首元素后s2=", s2)
printSlice(s2)
fmt.Println("删除尾元素")
tail := s2[len(s2)-1] //用于接收尾元素
s2 = s2[:len(s2)-1]
fmt.Println("尾元素", tail, ",去除尾元素后s2=", s2)
printSlice(s2)

结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值