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