Golang的append工作流程

NeverLea · · 2247 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

总感觉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]

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:NeverLea

查看原文:Golang的append工作流程

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2247 次点击  
加入收藏 微博
5 回复  |  直到 2019-10-01 16:04:28
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传