若是改變了本來的值,切片的值也會跟着變,
若是改變了切片的值,本來的值也會跟着變,
因此有指針特性,其實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並非純引用類型測試