a[i] = i只需将值分配
i给
a[i]。这 不是
附加,只是一个简单的赋值。
现在添加:
a = append(a, i)
理论上会发生以下情况:
这将调用内置
append()
函数。为此,它首先必须复制a
切片(切片标头,后备数组不是标头的一部分),并且必须为可变参数创建一个临时切片,该临时切片将包含valuei
。然后,
a
如果它具有足够的容量(在您的情况下具有)a = a[:len(a)+1]
,则必须重新切片-这涉及将新的切片分配到的a
内部append()
。
(如果a
没有足够大的容量来执行“就地”附加操作,则必须分配一个新数组,复制切片中的内容,然后执行assign / append-但这不是这种情况。)然后分配
i
给a[len(a)-1]
。然后从返回新切片
append()
,并将此新切片分配给局部变量a
。
与简单的任务相比,这里发生了很多事情。即使对这些步骤中的许多步骤进行了优化和/或内联,作为分配
i给切片元素的最低要求 ,切片类型
的局部变量
a(它是切片标头) 也必须在循环的每个循环中进行更新 。
推荐阅读:The Go Blog:数组,切片(和字符串):“ append”的机制



