数组和切片区别

2019-10-06  本文已影响0人  jsqwj
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]
  1. 数组赋值会直接拷贝一份,而切片赋值会传指针。
  2. 函数传参,同上
  3. 当切片append的时候,go会考虑切片的cap值,如果超过了当前cap值,则可能会对整个切片进行拷贝一份,并且进行扩容。所以会导致很多异常的情况。
上一篇下一篇

猜你喜欢

热点阅读