若是改变了本来的值,切片的值也会跟着变,
若是改变了切片的值,本来的值也会跟着变,
因此有指针特性,其实slice的底层存储就是数组。
go语言的slice是并非纯引用类型,而是一种包含指针的聚合类型,相似数组
type IntSlice struct{ ptr *int len int cap int }
由于相似struct,因此仍是值传递bash
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了app
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并非纯引用类型测试