這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
我比較喜歡先給出代碼,然後得出結論
數組
1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func main() { 8 arr := [...]int{1, 2, 3} 9 //列印初始的指標10 fmt.Printf("the pointer is : %p \n", &arr)11 printPointer(arr)12 }13 14 func printPointer(any interface{}) {15 fmt.Printf("the pointer is : %p \n", &any)16 }
結果
1 the pointer is : 0xc082008580 2 the pointer is : 0xc0820001d0
切片
1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func main() { 8 arr := make([]int, 3) 9 //列印初始的指標10 fmt.Printf("the pointer is : %p \n", arr)11 printPointer(arr)12 }13 14 func printPointer(any interface{}) {15 fmt.Printf("the pointer is : %p \n", any)16 }
結果
1 the pointer is : 0xc082008580 2 the pointer is : 0xc082008580
map
1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func main() { 8 arr := make(map[int]string) 9 //arr := [3]int{1, 2, 3}10 //列印初始的指標11 fmt.Printf("the pointer is : %p \n", arr)12 printPointer(arr)13 }14 15 func printPointer(any interface{}) {16 fmt.Printf("the pointer is : %p \n", any)17 }
運行結果
1 the pointer is : 0xc082007c80 2 the pointer is : 0xc082007c80
由此,我們看到數組本身傳過去的是值,傳到函數之後,被開闢了另外一個空間。
因為數組就是他本身。這一句好像不太好理解。
這是切片 arr := make([]int, 3) 而arr 本身不是一個數組,至少不是我們所想要的指向的一個數組。只是arr裡有一個地址指向數組。
這麼舉個例子:
arr := [...]int{1,2,3,4,5} 這是一個數組,懂得go語言的都明白。 arr本身就是數組
arrSlice := arr[0:5] 這是一個切片。 列印所得的值是一樣的,和上面。 arrSlice本身不是數組,只是arrSlice本身有一個值是指向arr的指標。
切片是指一個結構體,大體結構像這樣
1 struct slice{2 ptr *Elem3 len int4 cap int5 }
也就是說,上面的arrSlice其實是一個結構體。裡面有一個屬性 ptr指向數組 arr
其實arrSlice也是傳到函數裡,也是進行了複製。但是儘管傳過去是一個複製的結構體,他的屬性ptr,沒有變。還是一個指向原數組的指標。
下面的例子見證他自己傳過去,是一個複製的過程:
1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func main() { 8 arrSlice := make([]int, 4) 9 fmt.Printf("the pointer is : %p \n", arrSlice)10 fmt.Printf("the pointer is : %p \n", &arrSlice) //這是arrSlice本身的指標,也就是結構體的指標11 printPointer(arrSlice)12 }13 14 func printPointer(any interface{}) {15 fmt.Printf("the pointer is : %p \n", any) 16 fmt.Printf("the pointer is : %p \n", &any) //列印傳過來的結構體arrSlice的指標17 }
看結果:
1 the pointer is : 0xc0820085a0 2 the pointer is : 0xc082008580 3 the pointer is : 0xc0820085a0 4 the pointer is : 0xc0820001d0
第1、3個的列印是列印這個結構體的ptr屬性,也就是指向數組的指標。
其實這個結構體傳到函數裡,是一個複製的過程,第2、4的指標不一樣。
大家在對照下面的圖片理解一下: