go语言的 slice切片不是纯引用类型
总结
如果改变了原本的值,切片的值也会跟着变,
如果改变了切片的值,原本的值也会跟着变,
所以有指针特性,其实slice的底层存储就是数组。
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并不是纯引用类型
相关推荐
TreasureZ 2020-06-20
徐建岗网络管理 2020-06-11
NameCHC 2020-05-25
FCLAMP 2020-04-17
First00 2020-03-01
TyrionZK 2020-01-29
hitxueliang 2020-01-07
zhouxihua0 2019-12-24
First00 2019-12-16
yfisaboy 2019-12-09
阿狸写代码 2019-12-02
bangrenzhuce 2019-11-19
fuguangchao 2019-10-21
tydldd 2019-10-22
beloveddarling 2015-02-26
wayne0 2015-05-26
del 2015-10-16
jiangbo0 2019-07-01