美文网首页
数组和切片区别

数组和切片区别

作者: jsqwj | 来源:发表于2019-10-06 19:53 被阅读0次
    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值,则可能会对整个切片进行拷贝一份,并且进行扩容。所以会导致很多异常的情况。

    相关文章

      网友评论

          本文标题:数组和切片区别

          本文链接:https://www.haomeiwen.com/subject/ggtppctx.html