文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Go slice切片make生成append追加copy复制的方法

2023-07-02 08:31

关注

这篇文章主要介绍“Go slice切片make生成append追加copy复制的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go slice切片make生成append追加copy复制的方法”文章能帮助大家解决问题。

加深理解

生成切片 make

上需求:请定义一个长度为5,容量为10的整型切片。

上代码:

s1 := make([]int,5,10)fmt.Printf("s1:%v len(s1):%d cap(s1):%d\n", s1, len(s1), cap(s1))

打印结果:

Go slice切片make生成append追加copy复制的方法

分析:make()函数的第一个参数指定切片的数组类型,第二个参数指定切片的长度,第三个参数指定切片的容量。

更好的理解长度和容量

s1 := make([]int,5,10)fmt.Printf("s1:%v len(s1):%d cap(s1):%d\n", s1, len(s1), cap(s1))s2 := make([]int, 0, 10)fmt.Printf("s2=%v len(s2)=%d cap(s2)=%d\n", s2, len(s2), cap(s2))

打印结果:

Go slice切片make生成append追加copy复制的方法

分析: 我们可以发现定义切片时元素的个数和长度相关,因为长度就是元素的个数。

容量我们在下面介绍append()时,重点介绍一下。

切片引用类型实战

上代码

//切片s3 := make([]int, 3, 3)s3 = []int{1, 2, 3}s4 := s3            //s3 s4都指向同一个底层数组fmt.Println(s3, s4) //[1 2 3]  [1 2 3]s3[0] = 1000fmt.Println(s3, s4) //[1000 2 3] [1 2 3]fmt.Println("-----")//数组a3 := [3]int{1, 2, 4}a4 := a3fmt.Println(a3, a4)a3[0] = 1000fmt.Println(a3, a4)

打印结果:

Go slice切片make生成append追加copy复制的方法

分析:通过上面的打印结果我们可以很直观的看出来,切片引用类型的本质,当切片修改时会互相影响;而数组作为值类型,不会互相影响。

切片的遍历

和数组一样,用fori或者for range进行遍历即可。

s3 := make([]int, 3, 3)s3 = []int{1, 2, 3}for i := 0; i < len(s3); i++ {   fmt.Println(s3[i])}for i, v := range s3 {   fmt.Println(i, v)}

Go slice切片make生成append追加copy复制的方法

append

首先,我们定义一个切片

s1 := []string{"北京", "上海", "大连", "佛山"}fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))

打印结果:

Go slice切片make生成append追加copy复制的方法

分析:我们发现切片的长度和容量都是4

然后,我们使用append()函数追加一个元素

s1 := []string{"北京", "上海", "大连", "佛山"}fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))s1 = append(s1, "唐山") //切片append()追加之后,fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))

打印结果:

Go slice切片make生成append追加copy复制的方法

分析:长度由4变成5,我们很好理解;容量为什么会从4变成8呢?

这是Go语言对切片的自动扩容机制。append()追加元素,原来的底层数据容量不够时,go底层会把底层数组替换,是go语言的一套扩容策略

我后面会单独写一篇来讲自动扩容策略是如何实现的。欢迎大家持续关注我的专栏Go语言学习专栏

多次追加

多次追加的概念很好理解,就是多次调用append()

举个栗子:

s1 := []string{"北京", "上海", "大连", "佛山"}fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))s1 = append(s1, "唐山") //切片append()追加之后,fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))var s2 []strings2 = append(s1, "雄安")fmt.Printf("s2=%v len(s2)=%d cap(s2)=%d\n", s2, len(s2), cap(s2))

打印结果:

Go slice切片make生成append追加copy复制的方法

分析: s1经过两次append追加元素,赋值给了s2

追加多个元素

当我们需要追加多个元素时,难道只能像上面这样多次调用append吗?

当然不是的。

举个栗子:

s1 := []string{"北京", "上海", "大连", "佛山"}s3 := []string{"太原","石家庄"}var s4 []strings4 = append(s1,s3...) // ...表示拆开,将切片的值作为追加的元素fmt.Printf("s4的值:%v",s4)

打印结果:

Go slice切片make生成append追加copy复制的方法

注意:append的第二个参数,我们传入了一个切片,需要在切片后写死...,表示将切片切割,将切片的值作为追加到第一个参数中的元素。

复制切片

下面演示两种方式:

//定义切片s1s1 := []int{1, 2, 3}//第一种方式:直接声明变量 用=赋值//s2切片和s1引用同一个内存地址var s2 = s1//第二种方式:copyvar s3 = make([]int, 3)copy(s3, s1)            //使用copy函数将 参数2的元素复制到参数1fmt.Println(s1, s2, s3) //都是[1 2 3]

打印结果:都返回[1 2 3]

Go slice切片make生成append追加copy复制的方法

注意:make和:=不能同时使用,这种是错误的写法 :s3 := make([]int, 5)

聪明的小伙伴们是不是提出疑问了呢?

既然结果一样,为什么要引出copy这个函数呢?

咱们接着往下看,就知道所以然了。

//定义切片s1s1 := []int{1, 2, 3}//第一种方式:直接声明变量 用=赋值//s2切片和s1引用同一个内存地址var s2 = s1//第二种方式:copyvar s3 = make([]int, 3)copy(s3, s1)            //使用copy函数将 参数2的元素复制到参数1s1[0] = 11fmt.Printf("s1:%v s2:%v s3:%v",s1, s2, s3) //s1和s2是[11 2 3] s3是[1 2 3]

打印结果:

Go slice切片make生成append追加copy复制的方法

分析: 我们发现s1和s2是[11 2 3] s3是[1 2 3],说明copy方法是复制了一份,开辟了新的内存空间,不再引用s1的内存地址,这就是两者的区别。

删除元素

注意:删除切片中的元素 不能直接删除 可以组合使用分割+append的方式删除切片中的元素

举个栗子:比如切除s3中的元素2(下标为1的元素)

s3 := []int{1, 2, 3}s3 = append(s3[:1], s3[2:]...) //第一个不用拆开 原因是一个作为被接受的一方  是把后面的元素追加到第一个fmt.Println(s3)

打印结果:

Go slice切片make生成append追加copy复制的方法

注意:上面代码段中有我添加的注释:append()函数中第一个切片不用拆开,原因是一个作为被接受的一方,是把后面的元素追加到第一个切片中。

数组转切片

a1 := [...]int{1,2,3}s1 := a1[:]fmt.Printf("a1类型:%T\ns1类型:%T",a1,s1)

打印结果:

Go slice切片make生成append追加copy复制的方法

实战演练

猜想一下下面程序的运行结果:

s1 := make([]int, 5, 10)for i := 0; i < 10; i++ {   s1 = append(s1, i)}fmt.Println(s1)

.

.

.

打印结果:

Go slice切片make生成append追加copy复制的方法

分析: 我们静下心来逐步推导就ok了:

关于“Go slice切片make生成append追加copy复制的方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯