何时在 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
或类似的(例如,copy
、append
隐藏在某些函数后面等)。
由于对 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,但见仁见智。
我正在学习围棋。根据文档,切片比数组更丰富。
但是,我未能掌握切片的假设用例。
使用切片而不是数组的用例是什么?
谢谢!
这真的很基础,可能应该已经包含在您正在阅读的任何文档中(除非它只是语言规范),但是: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
或类似的(例如,copy
、append
隐藏在某些函数后面等)。
由于对 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,但见仁见智。