内容简介:如果改变了原本的值,切片的值也会跟着变,如果改变了切片的值,原本的值也会跟着变,所以有指针特性。
总结
如果改变了原本的值,切片的值也会跟着变,
如果改变了切片的值,原本的值也会跟着变,
所以有指针特性。
go语言的slice是并不是纯引用类型,而是一种包含指针的聚合类型,类似
type IntSlice struct{ ptr *int len int cap int }
因为类似struct,所以还是值传递
样例1·
测试程序
package main import "fmt" func main(){ a :=[...]int{0,1,2,3,4,5,6,7,8,9} fmt.Println(a) s1:=a[:] s2:=s1[:] fmt.Println(s1) fmt.Println(s2) fmt.Println("") fmt.Println("-------------------------------") fmt.Println("") a[9]=10 s2[0]=100 fmt.Println(a) fmt.Println(s1) fmt.Println(s2) }
输出
[0 1 2 3 4 5 6 7 8 9] [0 1 2 3 4 5 6 7 8 9] [0 1 2 3 4 5 6 7 8 9] ------------------------------- [100 1 2 3 4 5 6 7 8 10] [100 1 2 3 4 5 6 7 8 10] [100 1 2 3 4 5 6 7 8 10]
分析
0全变100了
9全变10了
样例2
测试程序
package main import "fmt" func add1(s []int,x int) []int{ s=append(s,x); return s } func add2(s []int,x int){ s=append(s,x); } func main(){ a :=[...]int{0,1,2,3,4,5,6,7,8,9} fmt.Println(a) s1:=a[5:8]//len=3 cap=5 fmt.Println(s1) add2(s1,0) fmt.Println(a) fmt.Println(s1) add2(s1,1) fmt.Println(a) fmt.Println(s1) }
输出
[0 1 2 3 4 5 6 7 8 9] [5 6 7] [5 6 7] [0 1 2 3 4 5 6 7 0 9] [5 6 7] [0 1 2 3 4 5 6 7 1 9]
分析
数组的 8依次变成了 0、1
但slice s1始终没变
说明slice并不是纯引用类型
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Ajax设计模式
Michael Mahemoff / 杨仁和 / 电子工业出版社 / 2007-5 / 78.00元
★本书荣获LinuxWorld Linux Journal2006年Editors' Choice awards。 ★绝好的一本ajax 高级读物,建议 每个web 程序员都需要买一本,了解什么是真正的好的web设计--网友 [精彩试读一] [精彩试读二] 本书是一本关于复杂Ajax应用的整体架构设计......一起来看看 《Ajax设计模式》 这本书的介绍吧!