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取的地址为底层数组的指针地址