引用“失效”
實現了刪除slice最後一個item的函數
func rmLast(a []int) { fmt.Printf("[rmlast] the address of a is %p", a) a = a[:len(a)-1] fmt.Printf("[rmlast] after remove, the address of a is %p", a)}
調用此函數後,發現原來的slice並沒有改變
func main() { xyz := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} fmt.Printf("[main] the address of xyz is %p\n", xyz) rmLast(xyz) fmt.Printf("[main] after remove, the address of xyz is %p\n", xyz) fmt.Printf("%v", xyz) //[1 2 3 4 5 6 7 8 9]}
列印出來的結果如下:
[main] the address of xyz is 0xc2080365f0[rmlast] the address of a is 0xc2080365f0[rmlast] after remove, the address of a is 0xc2080365f0[main] after remove, the address of xyz is 0xc2080365f0[1 2 3 4 5 6 7 8 9]
這裡直接列印了slice的指標值,因為slice是參考型別,所以指標值都是相同的,我們換成列印slice的地址看下
func rmLast(a []int) { fmt.Printf("[rmlast] the address of a is %p", &a) a = a[:len(a)-1] fmt.Printf("[rmlast] after remove, the address of a is %p", &a)}func main() { xyz := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} fmt.Printf("[main] the address of xyz is %p\n", &xyz) rmLast(xyz) fmt.Printf("[main] after remove, the address of xyz is %p\n", &xyz) fmt.Printf("%v", xyz) //[1 2 3 4 5 6 7 8 9]}
結果:
[main] the address of xyz is 0xc20801e1e0[rmlast] the address of a is 0xc20801e200[rmlast] after remove, the address of a is 0xc20801e200[main] after remove, the address of xyz is 0xc20801e1e0[1 2 3 4 5 6 7 8 9]
這次可以看到slice作為函數參數傳入函數時,實際上也是拷貝了一份slice,因為slice本身是個指標,所以從現象來看,slice是參考型別