golang切片傳參,一般認為傳參為引用傳參,如果修改函數內的slice值,則main函數中的切片數值發生改變, 但是只用append函數給slice添加數據后,main函數里面的slice數組並沒有變化。
實際是因為slice作為參數傳遞時值傳遞,傳遞的是slice的底層結構體,復制了一個數組指針,len和cap。
雖然ap函數里面的數組指針里面的數組里面的數據有所增加,或者更換了底層數組指針,但是main函數中的仍然為原來的slice結構體,所以沒有改變。
package main import ( "fmt" "unsafe" ) func main() { slice := []int{} fmt.Printf("main slice:%v &slice:%p unsafe.Pointer:%p slice:%p len:%d cap:%v\n", slice, &slice, unsafe.Pointer(&slice), slice, len(slice), cap(slice)) slice = append(slice, 1, 2, 3, 4, 5) fmt.Printf("main slice:%v &slice:%p unsafe.Pointer:%p slice:%p len:%d cap:%v\n", slice, &slice, unsafe.Pointer(&slice), slice, len(slice), cap(slice)) slice = append(slice, 6) fmt.Printf("main slice:%v &slice:%p unsafe.Pointer:%p slice:%p len:%d cap:%v\n", slice, &slice, unsafe.Pointer(&slice), slice, len(slice), cap(slice)) slice = append(slice, 7) fmt.Printf("main slice:%v &slice:%p unsafe.Pointer:%p slice:%p len:%d cap:%v\n", slice, &slice, unsafe.Pointer(&slice), slice, len(slice), cap(slice)) ap(slice) fmt.Printf("main slice:%v &slice:%p unsafe.Pointer:%p slice:%p len:%d cap:%v\n", slice, &slice, unsafe.Pointer(&slice), slice, len(slice), cap(slice)) } func ap(slice []int) { fmt.Printf("ap slice:%v &slice:%p unsafe.Pointer:%p slice:%p len:%d cap:%v\n", slice, &slice, unsafe.Pointer(&slice), slice, len(slice), cap(slice)) slice[0] = 10 slice = append(slice, 10) fmt.Printf("ap slice:%v &slice:%p unsafe.Pointer:%p slice:%p len:%d cap:%v\n", slice, &slice, unsafe.Pointer(&slice), slice, len(slice), cap(slice)) }
注:切片的取地址的%p取的地址為底層數組的指針地址