大家好,又见面了,我是你们的朋友全栈君。
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,则每次赋值给CateOut
的cate[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账号...