golang 切片传参

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取的地址为底层数组的指针地址
posted @ 2021-11-08 11:14  skytian  阅读(1224)  评论(0)    收藏  举报