package main
import (
"fmt"
"unsafe"
"reflect"
)
func main() {
a := [10]int{1,2,4}
b := make([]int, 10,100)
copy(b, a[:10])
test(b)
c:=b
fmt.Printf("%d %d\n",(*reflect.SliceHeader)(unsafe.Pointer(&c)).Data, (*reflect.SliceHeader)(unsafe.Pointer(&b)).Data)
c = append(c, 100)
b = append(b, 200)
fmt.Printf("%d %d\n",(*reflect.SliceHeader)(unsafe.Pointer(&c)).Data, (*reflect.SliceHeader)(unsafe.Pointer(&b)).Data)
fmt.Println(c,b)
}
func test(a []int){
a[0] = 99
}
824634302464 824634302464
824634302464 824634302464
[99 2 4 0 0 0 0 0 0 0 200] [99 2 4 0 0 0 0 0 0 0 200]
当 b := make([]int,10)时候,
824633843792 824633843792
824634310656 824634310816
[99 2 4 0 0 0 0 0 0 0 100] [99 2 4 0 0 0 0 0 0 0 200]
- 数组赋值会直接拷贝一份,而切片赋值会传指针。
- 函数传参,同上
- 当切片append的时候,go会考虑切片的cap值,如果超过了当前cap值,则可能会对整个切片进行拷贝一份,并且进行扩容。所以会导致很多异常的情况。