切片声明如 [0:2]

4
我不理解Go语言中的切片声明。
对我而言,数组的第一个和第二个元素的声明应该是0:1。但实际上是0:2。为什么?我该如何理解这个范围,从零到2减1(始终如此)?
var slice = array[0:2]  
2个回答

7

切片边界是半开区间,这在许多编程语言中都很常见。 一个优点是它使范围的长度显而易见(2-0 = 2)。 具体来说,通常会这样做:

s[start:start+len]

而且很明显,这将从切片中选择len个元素,从start开始。如果范围完全关闭(两个边界都包括),那么代码中就必须有很多-1来处理切片和子切片。
在C++范围和Python等中,它的工作方式类似。这里有一些来自C++答案的推理,归因于Dijkstra:
  • 您希望范围的大小是简单的差异end-begin;

  • 当序列退化为空序列时,包括下限更加“自然”,另外因为替代方案(排除下限)需要存在“开始之前”的哨兵值。


1

通过指定两个索引来创建一个切片,一个低位和一个高位,它们之间用冒号分隔:

a[low : high]

这将选择一个半开区间,包括第一个元素,但不包括最后一个。

这段内容来自Golang关于切片的页面https://tour.golang.org/moretypes/7


谢谢,我不理解“半开区间”的概念。在之前的PHP和C中没有见过这个。 - ABSimon
@ABSimon:C语言中的数组也是如此。int a[10]创建了0-9个元素。 - Zan Lynx
1
@ZanLynx 我认为这是因为长度而不是一半开放的原因。 - atakanyenel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接