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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM