【问题标题】:When to use slice instead of an array in GO在 GO 中何时使用切片而不是数组
【发布时间】:2021-06-30 05:45:29
【问题描述】:

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

但是,我无法掌握切片的假设用例。

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

谢谢!

【问题讨论】:

  • 一个 Go 数组总是有一个固定的大小。如果你总是需要 10 个 T 类型的东西,[10]T 就可以了。如果您需要可变数量的事物n,其中n 是在运行时确定的怎么办?
  • 请将此添加为答案,我将标记为正确答案。谢谢!

标签: arrays go slice


【解决方案1】:

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

Go 切片——它由两部分组成,一个 切片头 和一个底层 支持数组——非常适合保存访问可变大小数组所需的信息.请注意,只需声明一个切片头变量:

var x []T

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

  • 一个实际的数组,或者
  • 致电make,或
  • 使用内置的append 或类似的(例如,copyappend 隐藏在某些功能后面等)。

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

Go blog entry on slices 对此有很多话要说。比起Go Tour starting here 中的页面序列,我更喜欢这个页面,但意见不一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2023-03-20
    • 2019-01-02
    • 2016-06-24
    • 1970-01-01
    相关资源
    最近更新 更多