golang数组引用例如。 b [1:4]引用元素1,2,3

时间:2011-05-03 11:42:10

标签: go

golang博客指出:

“也可以通过”切片“现有的切片或数组来形成切片。通过指定半开放范围来完成切片,其中两个索引用冒号分隔。例如,表达式b [1:4]创建包含b的元素1到3的切片(得到的切片的索引将是0到2)。“

有人可以向我解释上面的逻辑。 IE浏览器。为什么b [1:4]没有参考元素1到4?这与其他数组引用一致吗?

4 个答案:

答案 0 :(得分:8)

索引指向元素的“开始”。所有使用从零开始索引的语言共享:

       | 0 | first | 1 | second | 2 | third | 3 | fourth | 4 | fifth | 5 |
[0]   =  ^
[0:1] =  ^ --------> ^
[1:4] =              ^-------------------------------------> ^  
[0:5] =  ^ ----------------------------------------------------------> ^

支持负索引也很常见,尽管Go不允许这样做:

       |-6 |       |-5 |        |-4 |       |-3 |        |-2 |       |-1 |
       | 0 | first | 1 | second | 2 | third | 3 | fourth | 4 | fifth | 5 |

答案 1 :(得分:4)

半开放时间间隔是有道理的,原因很多,当你开始考虑时。例如,像这样的半开区间,元素的数量是:

n = end - start

这是一个非常好的和简单的公式。对于封闭的间隔,它将是:

n = (end - start) + 1

(不是很多,但仍然)更复杂。

这也意味着例如一个字符串,整个字符串是[1, len(s)],看起来也很直观。如果间隔已关闭,要获取整个字符串,您需要[1, len(s) + 1]

答案 2 :(得分:3)

原因在Slices的Go语言规范部分中给出。

  

对于字符串,数组或切片a,   主要表达

    a[low : high]
     

构造子字符串或切片。该   索引表达式低和高选择   哪些元素出现在结果中。   结果索引从0开始   和长度等于高 - 低。

     

为方便起见,任何索引   表达式可以省略。一个失踪   低指数默认为零;一个失踪   高索引默认为长度   切片的操作数。

将切片的长度计算为高 - 低是简单而有效的。

答案 3 :(得分:2)

Go使用half-open intervals作为许多其他语言的切片。在更加数学符号中,切片b[1:4]是排除上端点的区间[1,4)