golang博客指出:
“也可以通过”切片“现有的切片或数组来形成切片。通过指定半开放范围来完成切片,其中两个索引用冒号分隔。例如,表达式b [1:4]创建包含b的元素1到3的切片(得到的切片的索引将是0到2)。“
有人可以向我解释上面的逻辑。 IE浏览器。为什么b [1:4]没有参考元素1到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)
。