【问题标题】:Slice declarations like [0:2]像 [0:2] 这样的切片声明
【发布时间】:2019-07-17 12:04:40
【问题描述】:

我不懂 Go 中的切片声明。

对于我来说,数组的第一个和第二个元素的声明必须是 0:1。 但它是 0:2。为什么?我应该怎么读这个,从 0 到 2 减 1(一直)?

var slice = array[0:2]  

【问题讨论】:

    标签: go slice


    【解决方案1】:

    切片边界是half open,这对于许多编程语言来说是非常标准的。一个优点是它使范围的长度变得明显(2-0=2)。具体来说,这样做很常见:

    s[start:start+len]
    

    很明显,这会从切片中选择len 元素,从start 开始。如果范围完全封闭(包括两个边界),代码中必须有很多 -1s 来处理切片和子切片。

    它在 C++ 范围和 Python 等中的工作方式类似。这是来自 C++ answer 的一些推理,归因于 Dijkstra:

    • 您希望范围的大小是一个简单的差异 end - begin;

    • 当序列退化为空序列时,包括下限更“自然”,并且还因为替代方案(不包括下限)需要存在“一个在开始之前”的标记值.

    【讨论】:

      【解决方案2】:

      切片是通过指定两个索引来形成的,一个下限和上限, 用冒号隔开:

      a[low : high]

      这会选择一个半开范围,其中包括第一个 元素,但不包括最后一个。

      这是来自 Golang 的切片页面https://tour.golang.org/moretypes/7

      【讨论】:

      • 谢谢,我不明白“半开范围”背后的想法。之前在 php 和 c 中没有见过这个......
      • @ABSimon:C 对数组也是如此。 int a[10] 创建元素 0-9。
      • @ZanLynx 我认为这是因为长度而不是半开放性
      猜你喜欢
      • 2014-10-22
      • 2013-08-20
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 2019-04-30
      相关资源
      最近更新 更多