考虑下面的go代码:
fruits := [4]string{"apple", "orange", "mango"}
tasty_fruits := fruits[1:3]
fmt.Println(len(tasty_fruits))
fmt.Println(cap(tasty_fruits))
fmt.Println(tasty_fruits)
:
2
3
[orange mango]
我不明白的是,为什么taste_fruits的容量为3,直觉上我希望为2,因为这是切片的长度?
而且,如果tasty_fruits的容量为3,那么为什么:
tasty_fruits[2] = "nectarine"
造成:
panic: runtime error: index out of range
这行:
fruits := [4]string{"apple", "orange", "mango"}
创建一个 数组 ,而不是一个切片。即使您仅提供了3个元素,它也有4个元素。输出fmt.Printf("%q", fruits)
:
["apple" "orange" "mango" ""]
切片:
tasty_fruits := fruits[1:3]
结果是:
["orange" "mango"]
长度:明显2.容量?
的 容量 是…的片的长度和超过所述切片中的[基本]阵列的长度的总和。
由于"mango"
底层数组中仅包含一个元素,因此容量为2 + 1 = 3
。
索引切片(tasty_fruits
):规范:索引表达式:
对于
a
切片类型S
:a[x]
- 如果
x
在运行时超出范围,则会发生运行时恐慌
x
如果为0 <= x < len(a)
,则在范围内,否则为超出范围。由于len(tasty_fruits)
is
2
,索引2
超出范围,因此发生运行时恐慌。
即使容量允许,也无法索引超出片段长度的片段。如果您对切片进行切片,则只能达到超出长度的元素,例如:
tasty_fruits2 := tasty_fruits[:3]
tasty_fruits2[2] = "nectarine" // This is ok, len(tasty_fruits2) = 3
fmt.Printf("%q", tasty_fruits2)
输出:
["orange" "mango" "nectarine"]
问题内容: 切成容量小于长度的切片 尝试运行时会出现以下错误。 我的问题是容量可以小于长度吗? 如果是,那么为什么会出现此错误? 如果为“否”,那么为什么这是运行时错误,为什么不是编译时? 问题答案: 不可以,容量不能少于长度。 切片是对数组一部分的引用。切片的容量代表该后备阵列的大小。如果其长度大于其容量,则使用什么内存? 以下不变量始终对slice s有效(除非您做了不安全的操作): 您的代码
问题内容: 为什么会发生以下现象: 可执行示例 问题答案: 构建一个空切片,就像一个空数组一样,它是一个有效且有用的对象(在所有语言中,而不仅仅是在Go中)。 空切片还仍然指向基础数组,位置和容量,有时可以扩展: 另一方面,长度为负的切片不一致。它没有任何意义,因此被禁止。
问题内容: 我注意到,当容量为奇数时,切片的容量表现为不同的方式。更具体地说:将元素添加到切片时,如果原始容量为偶数,则切片的容量将 增加一倍 。但是,当原始容量为奇数时,容量将 增加1,然后再增加一倍 。例: 假设这不是错误,那么此行为的原因是什么? 链接到游乐场:http : //play.golang.org/p/wfmdobgCUF 问题答案: 简短答案 它正在舍入切片容量以填充分配的内存
问题内容: 为什么执行速度比切片慢? 令人惊讶的是,即使包括长度计算在内,切片仍然明显更快: 注意:此行为的第一部分已在 Python的数据分析 (第3章)中进行了说明,但未提供任何解释。 。 如果有帮助:这是;的C代码。这是输出: 问题答案: __可以通过考虑操作员完成工作所需的时间来解释 某些 性能差异: 差的另一部分可以通过以下事实来解释是一个 函数 ,和甚至无操作函数调用需要一点时间: 这
为什么在下面的代码中会出现此错误?我用的是Spyder 3.1。4,我通过IPython控制台运行这个。 编辑:完全错误: ['477''6615''63744'…,'NaN''NaN''NaN']回溯(最近一次呼叫最后一次): 文件“”,第1行,在运行文件中('C:/Users/ptillotson/Documents/Python Scripts/ud120 projects master/k
问题内容: 我在4Gb机器的64位linux操作系统中运行以下代码: 当我运行它时,我得到: 如果我更改,我将得到: 当我使用片大小的内存时,我原本希望如此,但是当我尝试使用时,我得到: 因此,显然我无法创建大小为的切片,这使我们想到了一个问题:如果内存不是问题,那么我在Go中无法创建的最大切片是什么? 我记得在Java中,原始数组索引是通过type来管理的,因此,原始数组的最大大小是的最大值,如