- 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/
这个问题在这里已经有了答案: Calculating mid in binary search (13 个回答) 关闭8年前。 我正在阅读二进制搜索...我知道查找中间值的传统方法就像 mid=(hi
我有一个大的 numpy 数组 k,形状未指定,我想构造一个相同形状的数组 d 当 中的相应条目时为 1.0 k 介于两个常量 lo 和 hi 之间,否则为 0.0。 (由于更大的代码在做什么,我不想
我正在尝试找出 Unicode 类别的基数,如 Lo。看来我找不到关于那个的权威信息。例如。 Fileformat.info维护此类别中有 11788 个字符的 View ,Codepoints.ne
假设我有一个像这样的对象数组 var outer = [ { "name": "T1", "inner": [ { "type": "DAY"
下面的代码是流行线段树代码的略微修改版本。 我的问题是为什么我们需要在递归构建树时进行 lo > hi 检查,我想不出一个 lo 永远大于 hi 的例子,因为在任何时候它们都等于 [2,2]递归不会更
算法如下: sort(A) quicksort(A, 0, n-1) end quicksort(A, lo, hi) if lo < hi then pi = partition(A
我现在在 Lo-Dash 文档站点上花了几个小时,但找不到解决我的问题的方法。不知道怎么叫,所以有点难找。我基本上想将一个数组分组到一个对象中,以便重复的条目是一个字段,而不同的条目是一个数组。 例如
看一眼 Lo-Dash 文档就会发现 API 属于以下类别: 数组, 链接, 收藏, 函数, 对象, 实用程序, 方法, 和属性 对 Arrays API 的更详细了解显示了大约 30 种适用于数组的
我知道 .so 文件是类似于 Windows 中的 .dll 文件的共享库文件,但是 .lo 文件呢? 最佳答案 .o object (contains compiled code)
如何使用 Lo Dash 使用大于和小于来过滤数组? 使用 Lo Dash 的 _.find demo data : var users = [ { 'user': 'barney', 'ag
我有一个来自推送项目的数组,当我使用 Lo-Dash 显示时,它按升序显示。 这是我的代码: Sorted Array // Sample array. var array = []; // Uti
是否有现有的方法可以在 ORMLite 中为我的 id 生成实现 HI/LO 算法? 我决定从 NHibernate 切换到 ORMLite,并且宁愿不使用 AutoIncrement 或 GUID。
我是 Java 编程新手,正在学习大学类(class),其中的作业是创建一个高/低猜谜游戏。游戏为用户提供最多 5 次尝试输入 1 到 100(含)之间的数字的机会。程序必须提供答案是否太低、太高或正
我有一个高低 ID 生成器,我在多线程环境中使用它。每个线程每秒最多可以调用生成器 100k 次 我有一个相当好的(而且安全的)实现,效果很好。 IdAllocator 是获取下一个“批处理”id 的
#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #define
我有一个经过简化的数据集: var data = [{ size: 400 }, { size: 500 }, { size: 800 }, { size: 400 }
我有两个对象 A 和 B。我想知道它们是否共享 key x 和 y。 我是这样写的: function sharesKeys(keys, objA, objB) { return _.ever
我在使用 Lo-Dash 合并两个对象时遇到问题并且不明白为什么下面的代码不起作用。我希望 _merge 调用用 fnaaa 扩展 bbb,但这并没有发生。 my={}; my.aaa=functio
如果我有类似的东西 var obj = [{keywords: "a, b, c"}, {keywords: "d, e, f"}] 然后做 var result = _.pluck(obj, 'ke
我有下面的内联汇编代码。我在存在 %hi、%lo 的每一行收到编译错误“错误:无效的‘asm’:%-字母后缺少操作数”。 void func() { __asm__ ( "lis %%r4,
我是一名优秀的程序员,十分优秀!