Golang的append工作流程

2017-09-15  本文已影响0人  NeverLee

总感觉golang的append设计反人类,不是在一个slice中追加元素,而是生成一个新的slice。正好今天被append坑了一次。作个标记先。

总结来说,append更像一个函数

func append(src []Type, eles... Type) tag []Type {
    if cap(src) >= len(src) + len(eles) { // 如容量够填充
        // 直接用ele填充src后面的空位
        // 返回的tag所用的内存块跟src一致
    } else {
        // 创造一个更大的新内存块
        // 将src的元素复制过来并之后填充eles
        // 返回的tag所用的内存块跟src不一致
    }
}

测试了一段代码,如下:

    a := []int{1,2,3}
    b := a[:2]
    c := append(b, 9)
    fmt.Println("a:", a)
    fmt.Println("b:", b)
    fmt.Println("c:", c)
    // a: [1 2 9]
    // b: [1 2]
    // c: [1 2 9]

    d := make([]int, 2, 2)
    e := d[:]
    f := append(e, 9)
    fmt.Println("d:", d)
    fmt.Println("e:", e)
    fmt.Println("f:", f)
    // d: [0 0]
    // e: [0 0]
    // f: [0 0 9]

    f[0] = 1
    fmt.Println("d:", d)
    fmt.Println("e:", e)
    fmt.Println("f:", f)
    // d: [0 0]
    // e: [0 0]
    // f: [1 0 9]

作者原创,转载请注明出处

上一篇 下一篇

猜你喜欢

热点阅读