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]这个地址所指向的值发生了改变,也不会影响到最后的结果。

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

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

(0)
上一篇 2022年6月18日 下午9:36
下一篇 2022年6月18日 下午9:36


相关推荐

  • 单片机定时器实验报告C语言,51单片机定时器实验报告.doc

    单片机定时器实验报告C语言,51单片机定时器实验报告.doc51单片机定时器实验报告51单片机定时器实验报告51单片机定时器实验实验内容:实验内容:编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。C语言程序#include#defineuintunsignedint#defineucahrunsignedcharsbitFM=P0^0;voidmain(){TMOD=0x01;TH0=(65535-50000)/256;…

    2022年7月26日
    8
  • ORA-01940: cannot drop a user that is currently connected

    ORA-01940: cannot drop a user that is currently connected

    2021年9月13日
    54
  • route-map的原理及简单应用「建议收藏」

    route-map的原理及简单应用「建议收藏」route-map(路由策略)

    2022年7月1日
    29
  • vs2013安装失败解决办法_dns解析失败怎么解决

    vs2013安装失败解决办法_dns解析失败怎么解决个人解决方案:在控制面板-》软件卸载中将VisualC++2012redistributable、VisualC++2010redistributable相关的编程语言的东西卸载后,重启再安装就可以了。有个问题就是:在重启的过程中发现win10关机和启动花了很长时间,可能因为我卸载了上面这些组件导致其需要更新。关于VisualC++2012redistributable是什么,

    2022年8月12日
    7
  • SQLite3下载与安装

    SQLite3下载与安装一 SQLite 概述 1 简介 SQLite 是一款开源的 嵌入式关系型数据库 它在便携性 易用性 紧凑型 高效性和可靠性有突出的表现 它是一款嵌入式数据库 所以在大多数嵌入式开发中都会使用 SQLite 它没有独立的进程 与所在的应用服务共同生存 代码也与应用程序代码在一起 对于内部程序有一个独立的数据库服务器 对于外部而言无法看到程序有一个关系型数据库在运行 程序也不需要关系数据库是如何运作的 只需要管理自己的数据即可 2 体系结构 SQLite 拥有简洁 模块化的体系结构 可以划分为 3 个子系统和 8 个独立

    2026年3月16日
    2
  • python字符串的使用方法_python字符串交叉

    python字符串的使用方法_python字符串交叉python字符串常用方法find(sub[,start[,end]])在索引start和end之间查找字符串sub​找到,则返回最左端的索引值,未找到,则返回-1​start和end都可

    2022年7月31日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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