美文网首页
Golang切片和数组

Golang切片和数组

作者: 阿duang_638a | 来源:发表于2022-02-15 09:17 被阅读0次

    数组

    • 数组是值类型,如果你将一个数组赋值给另外一个数组,那么,实际上就是将整个数组拷贝一份
    • 如果数组作为函数的参数,那么实际传递的参数是一份数组的拷贝,而不是数组的指针
    • array的长度也是Type的一部分,这样就说明[10]int和[20]int是不一样的。
    • 初始化数组需要指定大小,不指定也会根据初始化数据自动推算出大小,不可改变

    切片

    • 切片可以改变长度,在自动扩容时,在数组容量小于1024个元素时,每次扩容的数组容量是原来数组的2倍。当数组容量大于1024个元素时,每次扩容的数组容量变为原来数组的1.25倍
    • 切片是轻量级的数据结构,三个属性,指针,长度,容量
    • 初始化可以不指定长度,也可以指定长度和容量 避免频繁自动扩容
    • 切片是指针传递,因此切片作为参数传入函数后。在函数内部修改切片时,如果触发动态扩容 切片地址会发生改变。所以外部切片和内部切片不再是同一个切片。如果没有,外部切片和内部切片还是同一个

    append

    append 会返回切片内存地址,如果发生扩容返回的地址会发生变化。否则不变
    如果切片 s长度为3,容量为4。这个时候 分别声明两个变量 x,y 等于 append(s, x1 | y1) 最终x和y以及s的内存地址是一样的。只是长度不同 x和y的长度为4

    func main() {
        s := []int{5} // len=1 cap = 1
        s = append(s, 7) // len=2 cap=1*2=2
        s = append(s, 9) // len=3 cap = 2*2=4
        x := append(s, 11)
        y := append(s, 12)
        fmt.Printf("%p,%p,%p\n",s, x, y)
        fmt.Println(s, x, y)
    }
    /*
     * 0xc000014080,0xc000014080,0xc000014080
     * [5 7 9] [5 7 9 12] [5 7 9 12]
     */
    

    因为 在 s = append(s, 9) // len=3 cap = 2*2=4 这个时候s的实际数组长度为4,所以下面x=append(s, 11)时,切片认为s的容量够用所以在s后面追加了11并修改内存数据,并使用了相同的内存地址 只是长度记录为4. x=append(s, 12)时,切片认为s的容量够用所以在s后面追加了12 并修改内存数据 这个时候的修改会覆盖刚刚的11 所以最终 x和y内存地址和数据完全一样

    相关文章

      网友评论

          本文标题:Golang切片和数组

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