何时在 GO 中使用切片而不是数组

When to use slice instead of an array in GO

我正在学习围棋。根据文档,切片比数组更丰富。

但是,我未能掌握切片的假设用例。

使用切片而不是数组的用例是什么?

谢谢!

这真的很基础,可能应该已经包含在您正在阅读的任何文档中(除非它只是语言规范),但是:Go 数组始终具有固定大小。如果你总是需要 10 个 T 类型的东西,[10]T 就可以了。但是,如果您需要可变数量的东西 n,其中 n 是在运行时确定的?

Go slice——由两部分组成,slice header 和底层 backing array——非常适合保存信息需要访问可变大小的数组。请注意,只需声明一个 slice-header 变量:

var x []T

实际上还没有分配 T 的任何 array:切片头将被初始化以容纳 nil(转换为正确的类型)作为(缺少的)后备数组,0 作为当前大小,0 作为此数组的容量。因此,测试 x == nil 会说是,x 为零。要获得实际数组,您需要:

  • 实际数组,或
  • 调用make,或
  • 使用内置 append 或类似的(例如,copyappend 隐藏在某些函数后面等)。

由于对 make 的调用是在运行时发生的,因此此时它可以生成一个任意大小的数组。对 append 的一系列调用可以构建一个数组。请注意,每次调用 append may 都必须分配一个 new 后备数组,或者 may 能够就地扩展现有阵列,具体取决于容量。这就是为什么您需要 x = append(x, elem)x = append(x, elems...) 而不仅仅是 append(x, elem)append(x, elems...).

Go blog entry on slices has a lot more to say on this. I like this page more than the sequence of pages in the Go Tour starting here,但见仁见智。