切片是 Go 语言核心的数据结构, 然而 刚接触 Go 的程序员经常在切片的工作方式和行为表现上被绊倒. 比如, 明明说切片是引用类型但在函数内对其做的更改有时候却保留不下来, 有时候却可以 . 究其原因是因为我们很多人用其他语言的思维来尝试猜测 Go 语言中切片的行为, 切片这个内置类型在 Go 语言底层有其单独的类型定义, 而不是我们通常理解的其他语言中数组的概念.
文章翻译自罗伯. 派克发布在 Go Blog 中的文章, 文中详述了切片是如何被设计出来的以及其与数组的关联和区别, 以及内置 append 函数的实现细节. 虽篇幅很长, 还是建议认证读完, 尤其是关于切片的设计和 append 函数实现的部分, 理解了 "切片头" 后很多的切片行为就自然而然能够理解.
来源: http://www.tuicool.com/articles/JNN3umj