Go语言之append函数

Go语言之append函数append函数的作用官方解释append函数是向slice里面追加一个或多个元素,然后返回一个和slice一样类型的slice,其签名为funcappend(slice[]T,elements…T)[]Tappend所做的是在切片尾添加元素并返回结果。结果需要返回因为,正如我们手写的Append,底层的数组可能更改。使用示例:x:=[]int{1,2

大家好,又见面了,我是你们的朋友全栈君。

append函数的作用

  • 官方解释append函数是向slice里面追加一个或多个元素,然后返回一个和slice一样类型的slice,其签名为

    func append(slice []T, elements...T) []T
  • append 所做的是在切片尾添加元素并返回结果。结果需要返回因为,正如我们手写的 Append,底层的数组可能更改。
  • 使用示例:
  x := []int{1,2,3}
  x = append(x, 4, 5, 6)
  fmt.Println(x)
  • 打印输出值1 2 3 4 5

使用过程的坑

  • 在使用过程中有以下的坑:
var CateOut []*Category
var Cate []*Category={cate1,cate2,....,cate10}//已经初始化好的值
for j := 0; j < 10; j++ {
        CateOut = append(CateOut, cate[i])
    }
  • 上面的代码运行出来的CateOut结果为10个Cate[9]的值,其中Category为一个struct,但是需要的结果是CateOut完全复制Cate的值,坑。。。。
  • 解决方案,把上述的代码加上临时变量temp,即为:
var CateOut []*Category
var Cate []*Category={cate1,cate2,....,cate10}//已经初始化好的值
for j := 0; j < 10; j++ {
        var temp *Category
        temp=cate[i]
        CateOut = append(CateOut, temp)
    }
  • 问题神奇的就解决了,一脸懵逼。。。
  • 初步分析:应该是每经过一次for循环时都需要新创建一个临时变量temp,用这个干净的临时变量去取值然后赋给CateOut

总结:如果不用temp,则每次赋值给CateOutcate[i]本身就是一个地址,例如”AAA”,这个地址本身并没有改变,改变的只是这个地址指向的对象,因此原先的CateOut结果值会是[AAA],[AAA AAA],[AAA AAA AAA]...即每次增加一个完全相同的地址值,但是在之后的运行过程中地址AAA指向的值已经改变了,所以结果出错。但使用temp就不一样了,每次生成一个新的变量值,把新的地址赋给它,CateOut结果值会是[AAA],[AAA BBB],[AAA BBB CCC]...,这样即使cate[i]这个地址所指向的值发生了改变,也不会影响到最后的结果。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150076.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 知识蒸馏(Knowledge Distillation)

    知识蒸馏(Knowledge Distillation)1、DistillingtheKnowledgeinaNeuralNetworkHinton的文章"DistillingtheKnowledgeinaNeuralNetwork"首次提出了知识蒸馏(暗知识提取)的概念,通过引入与教师网络(teachernetwork:复杂、但推理性能优越)相关的软目标(soft-target)作为totalloss的一部分,以诱导学…

  • C语言编程中void什么意思,程序设计中遇到的void到底是什么意思

    C语言编程中void什么意思,程序设计中遇到的void到底是什么意思部分编程的初学者都会问”void是什么意思”,”为什么很多函数前都要加个void”.实际上,void最简单的解释就是把0转换成空类型的意思。下面用各个开发语言来详解void1.C语言中的void表示空类型,它跟int,float是同地位的,一般用在没有返回值的函数中,比如你写voidmain(),主函数完了不用写return语句,但是如果是intmain()或者是main(),你不写r…

  • 黑盒测试用例设计 二[通俗易懂]

    黑盒测试用例设计 二[通俗易懂]因果图法一.方法简介1.定义是一种利用图解法分析输入的各种组合情况,从而设计测试用例的方法,它适合于检查程序输入条件的各种组合情况。2.因果图法产生的背景等价类划分法和边界值分析方法都是着重考虑输入条件,但没有考虑输入条件的各种组合、输入条件之间的相互制约关系。这样虽然各种输入条件可能出错的情况已经测试到了,但多个输入条件组合起来可能出错的情况却被忽视了。如果在测试时必须考虑输入条件…

  • 红帽linux中安装oracle数据库_红帽系统下载

    红帽linux中安装oracle数据库_红帽系统下载Linux下安装Oracle系统最好是1G内存,2G的swap空间,硬盘至少需要4.5G空间。至少环境在LinuxServerrelease5.3以上如果是LinuxServerrelease5.1,改装oracle10.2g吧一、查看Linux版本[root@localhost~]#cat/etc/issueRedHatEnterpriseLinuxServerrel…

  • finalize方法_final与finalize区别

    finalize方法_final与finalize区别当对象没有引用指向时,虚拟机会按照一定的垃圾回收机制算法来调用finalize方法将该对象回收,并不是只要没有引用对象就会被回收。因此,可以调用System.gc()方法来主动调用垃圾回收机制,但也并不能保证一定能成功。在调用时,程序并不会阻塞在此处,而是会继续向下执行。默认的object类中的finalize方法是不作其余处理的。可以重写finalize方法来实现自己想要的资源释放操作,比如数据库连接等。…

  • 原来都是freesync惹的锅「建议收藏」

    原来都是freesync惹的锅「建议收藏」今天贪便宜入了一款创维的2k显示屏,开始用N卡+DP线驱动得挺稳定,然后手闲开了freesync,结果就各种闪烁、条纹。最无奈的是显示器菜单里freesycn选项竟然灰了,关不上了,呜呼!在打算退货前,胡乱操作了一通,例如,菜单里恢复出厂设置,无果。用HDMI线降分辨率、降刷新率,无果。进入工程界面(按住M在POWERON),没敢乱调,退出。然后再在菜单里恢复出厂设置…….最后菜单中选模式为文本,重新DP线接入,竟然freesync被神奇地关闭了。之后,2k屏就再没闪过,千万不要乱动free

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号