根据“围棋之旅”,在围棋切片中s,表达式的s[lo:hi]计算结果是从lo到的元素切片hi-1,包括:
s
s[lo:hi]
lo
hi-1
package main import "fmt" func main() { p := []int{0, // slice position 0 10, // slice position 1 20, // slice position 2 30, // slice position 3 40, // slice position 4 50} // slice position 5 fmt.Println(p[0:3]) // => [0 10 20] }
在我上面的代码示例中,“ p [0:3]”似乎直观地“读”为:“从位置0到位置3的切片”,等于[0,10,20,30]。但是,当然,它实际上等于[0 10 20]。
所以我的问题是:对高价值进行评估hi-1而不是简单地进行评估的设计原理是什么hi?感觉很不直观,但是我一定缺少某些原因,我很好奇这可能是什么。
hi
提前致谢。
这完全是一个惯例,当然还有其他方法可以做到这一点(例如,Matlab使用第一个索引为1的数组)。选择实际上取决于您想要的属性。事实证明,使用0索引数组时切片是包含所有的(即,从a到b的切片包含元素a并排除元素b)具有一些非常好的属性,因此这是一个非常常见的选择。这里有一些优点。
0索引数组和包含式-排他式切片的优点
(请注意,我使用的是非Go术语,因此我将以C或Java讨论数组的方式来讨论数组。数组是Go所谓的slice,而slice是子数组(即,“ slice”从索引1到索引4“))
arr
arr[0:len(arr)]
n, _ := r.Read(arr)
n
arr[:n]
arr[0:i]
arr[i:j]
arr[j:k]
arr[k:len(arr)]
func consecutiveSlices(ints []int) [][]int { ret := make([][]int, 0) i, j := 0, 1 for j < len(ints) { if ints[j] != ints[j-1] + 1 { ret = append(ret, ints[i:j]) i = j } } ret = append(ret, ints[i:j])
}
(这段代码显然不能很好地处理某些极端情况,但是您知道了)
如果我们尝试使用包含式和包含式切片来编写等效函数,则它将变得更加复杂。
如果有人能想到更多,请随时编辑并添加答案。