go语言切片微讲解

传递参数时分为值传递和地址传递,go语言中切片和map是地址传递,但是切片传递要有一个注意事项 例如:

1
2
3
4
5
6
7
8
9
package main
func test(a []int){
a=append(a,1,2,3)
}
func main(){
var s []int=[]int{89,4,5,6}
test(s)
fmt.Println(s)
}

在这里里面为什么调用函数后切片没有变化呢,切片不是地址传递吗?这是因为在test函数里面用了append()函数,在调用函数时,在栈区里面把1 2 3 添加到a里面然后重新分配了地址,而原来的s切片还是指向原来地址,根本没有变,所以在main函数里面打印出s还是原来的,不会改变,那么如何做到用了append后改变原来切片的值呢 如下

1
2
3
4
5
6
7
8
9
10
11
package main
import "fmt"
func test(a []int)(b []int){
b=append(a,1,2,3,7)
return
}
func main(){
var s []int=[]int{9,10}
s=test(s)
fmt.Println(s)
}

我们可以用return 把改变后的地址传回去这样就可以了 切片用append函数的时候一定要注意,因为如果容量不足的时候会自动扩充,如果原来的地址后面没有足够的空间那么就会重新找一个足够大的空间来储存,所以切片利用append的时候地址是有可能变化的。

-------------本文结束感谢您的阅读-------------

本文标题:go语言切片微讲解

文章作者:Wuman

发布时间:2018年09月03日 - 18:09

最后更新:2018年09月05日 - 12:09

原始链接:http://yoursite.com/2018/09/03/go语言切片微讲解/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。