Golang的append工作流程

Posted Golang语言社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang的append工作流程相关的知识,希望对你有一定的参考价值。

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

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

  1. func append(src []Type, eles... Type) tag []Type {

  2.     if cap(src) >= len(src) + len(eles) { // 如容量够填充

  3.         // 直接用ele填充src后面的空位

  4.         // 返回的tag所用的内存块跟src一致

  5.     } else {

  6.         // 创造一个更大的新内存块

  7.         // 将src的元素复制过来并之后填充eles

  8.         // 返回的tag所用的内存块跟src不一致

  9.     }

  10. }

复制代码

测试了一段代码,如下:

  1. a := []int{1,2,3}

  2.     b := a[:2]

  3.     c := append(b, 9)

  4.     fmt.Println("a:", a)

  5.     fmt.Println("b:", b)

  6.     fmt.Println("c:", c)

  7.     // a: [1 2 9]

  8.     // b: [1 2]

  9.     // c: [1 2 9]


  10.     d := make([]int, 2, 2)

  11.     e := d[:]

  12.     f := append(e, 9)

  13.     fmt.Println("d:", d)

  14.     fmt.Println("e:", e)

  15.     fmt.Println("f:", f)

  16.     // d: [0 0]

  17.     // e: [0 0]

  18.     // f: [0 0 9]


  19.     f[0] = 1

  20.     fmt.Println("d:", d)

  21.     fmt.Println("e:", e)

  22.     fmt.Println("f:", f)

  23.     // d: [0 0]

  24.     // e: [0 0]

  25.     // f: [1 0 9]

复制代码

本文来自:简书



以上是关于Golang的append工作流程的主要内容,如果未能解决你的问题,请参考以下文章

golang 匿名结构体怎么append?

Golang append是并发安全的吗

Golang append是并发安全的吗

Golang append是并发安全的吗

golang - 如何获得错误“已评估但未使用”

golang Golang的工作队列