1. 程式人生 > 其它 >golang 切片傳參

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取的地址為底層陣列的指標地址