- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
根据Tour of Go ,在 Go slice s
中,表达式 s[lo:hi]
求值为从 lo
到 hi 的元素 slice -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 的 slice ”,等于 [0, 10, 20, 30]。但当然,它实际上等于 [0 10 20]。
所以我的问题是:将上限值评估为 hi-1
而不仅仅是 hi
的设计原理是什么?感觉不直观,但我想念它一定是有原因的,我很好奇这可能是什么。
提前致谢。
最佳答案
这完全是一个约定俗成的问题,当然还有其他方法可以做到(例如,Matlab 使用第一个索引为 1 的数组)。选择实际上取决于您想要什么属性。事实证明,使用 0-indexed 数组,其中 slice 是独占的(即,从 a 到 b 的 slice 包括元素 a 并排除元素 b)具有一些非常好的属性,因此它是一个非常常见的选择。这里有一些优点。
0索引数组和包容-独占 slice 的优势
(请注意,我使用的是非 Go 术语,因此我将按照 C 或 Java 谈论数组的方式来讨论数组。数组是 Go 所谓的 slice , slice 是子数组(即, "从索引 1 到索引 4 的 slice "))
arr
,arr[0:len(arr)]
只是 arr
本身。这在实践中非常有用。例如,如果我调用 n, _ := r.Read(arr)
(其中 n
是读入 arr
的字节数) ,那么我可以只做 arr[:n]
来获取与实际写入 arr
的数据相对应的 arr
slice 。指数不重叠。这意味着如果我有 arr[0:i]
, arr[i:j]
, arr[j:k]
, arr[k:len(arr)]
,这些 slice 完全覆盖了 arr
本身。您可能不会经常发现自己像这样将数组划分为子 slice ,但它有许多相关的优点。例如,考虑以下代码,根据不连续的整数拆分数组:
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])
}
(这段代码显然不能很好地处理一些边缘情况,但你明白了)
如果我们尝试使用 inclusive-inclusive slice 来编写等效函数,那会明显更复杂。
如果有人能想到更多,请随时编辑此答案并添加它们。
关于go - 在 Go slice 中,为什么 s[lo :hi] end at element hi-1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26857582/
这个问题已经有答案了: printf anomaly after "fork()" (3 个回答) 已关闭 3 年前。 #include #include Void main() { Printf
我目前正在使用此正则表达式:\"([^"]+)?\"。这与基本的带引号的字符串匹配,例如 "Hi"。我需要: 要匹配:(“内容”) 要不匹配:(div:("content")) 要不匹配以下内容:(d
我要打印 hi GrandFather 但它似乎印喜父亲。而且我不明白如何区分 findSpecial 之间的使用和 findVirtual 我希望有人可以帮助我。谢谢 class GrandFath
for(i=0;i #include int main() { for(int i=0;i<2;i++) { if(fork()==0) { printf("Hi %d %d
这个问题已经有答案了: What is the difference between a function call and function reference? (6 个回答) 已关闭 7 年前。
这个问题已经有答案了: JavaScript: using constructor without operator 'new' (2 个回答) 已关闭 7 年前。 RegExp('hi') 和有什么
hi
)我试图用标签( ** )替换每组通配符( )。 例如,如果我有: var stuff = array( "The color *blue*!!!!", "The color *red
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why is the 'this' keyword required to call an extensio
这个问题在这里已经有了答案: How to set HTML value attribute (with spaces) (6 个答案) 关闭 8 个月前。 我有一个选择控件。我尝试用 jquery
我在玩弄 JavaScript 的 NaN 并在对数字/字符串的结果使用 typeof 运算符时发现了一些奇怪的行为。为什么会这样? 最佳答案 typeof 90/"hi" 被执行为 (typeof
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 1 年前。 Improve
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题吗? 更新问题,以便 editing this post 提供事实和引用来回答它. 关闭去年。 Improve thi
我有一个大的 numpy 数组 k,形状未指定,我想构造一个相同形状的数组 d 当 中的相应条目时为 1.0 k 介于两个常量 lo 和 hi 之间,否则为 0.0。 (由于更大的代码在做什么,我不想
为什么以下内容的计算结果为'hi'? 'hi' || true || 50 我对 javascript 并不是很陌生,但我正在通过阅读一些旧书来重新增强我的知识,而且我一生都不明白为什么它的计算结果为
我在确定一个对象是否为空时遇到问题...这是我的代码: 这个值没有数据 >>> x = Booking.objects.filter(date_select='2011-12-3') >>> prin
您好,我已经接触 Python 几周了,现在开始学习 tkinter。该按钮应包含文本 Say hello,当用户单击该按钮时,底部标签应显示名称并在其前面显示 Hi。但是我无法让标签显示“Hi {n
过去几天我一直在尝试执行我的 Google Charts 网页 ( jsfiddle ),但错误似乎一直在变化,即使我除了刷新网页之外没有做任何不同的事情。我尝试过使用 Chrome 的“清空缓存和硬
vim 8.0的:h :hi-link表示:hi link {from-group} NONE将删除一组的hi-link。如何删除所有hi-link定义? hi clear,syn clear和syn
我需要以大写字母的形式输出Hi,该字母包含在C++中的*框中。 image of the output required到目前为止,我只找到了逐行打印每一行的基本方法,但是有没有更聪明的方法来做到这一
我正在做一些编码 bat 练习,但我不太明白 for 循环内部发生了什么。 public static int countHi(String str){ int count = 0;
我是一名优秀的程序员,十分优秀!