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)


相关推荐

发表回复

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

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