我读了go slice usage and internals、Slice和Effective go#slice,但没有像这样的3数字切片:slice[a:b:c]
例如下面的代码:
package main
import "fmt"
func main() {
var s = []string{"a", "b", "c", "d", "e", "f", "g"}
fmt.Println(s[1:2:6], len(s[1:2:6]), cap(s[1:2:6]))
fmt.Println(s[1:2:5], len(s[1:2:5]), cap(s[1:2:5]))
fmt.Println(s[1:2], len(s[1:2]), cap(s[1:2]))
}go playground结果是这样的:
[b] 1 5
[b] 1 4
[b] 1 6我可以理解第三个问题是关于容量的,但是这个问题的确切含义是什么?
我在文档中遗漏了什么吗?
发布于 2015-01-14 16:34:40
正如我在"Re-slicing slices in Golang“中提到的,该语法已在Go 1.2中引入。
它在Full slice expressions中进行了记录
a[low : high : max]构造了一个与简单切片表达式
a[low : high]具有相同长度和相同元素的类型相同的切片。
此外,它通过将其设置为max - low来控制结果切片的容量。
只能省略第一个索引,默认为0。
对数组a进行切片后:
a := [5]int{1, 2, 3, 4, 5}
t := a[1:3:5]切片t的类型为[]int,长度为2,容量为4,元素为
t[0] == 2
t[1] == 3该功能的design document有以下理由:
有时会很有用,例如在自定义
[]byte分配管理器中,能够将切片传递给调用者,并知道调用者不能编辑超出真数组给定子范围的值。
因为append len允许程序员在没有意识到甚至没有提到cap cap.的情况下覆盖和 made 之间的条目,所以在语言中添加使这一点变得更加重要
发布于 2020-09-18 05:52:53
在切片表达式slice[a:b:c]或aSlice[1:3:5]中
a:b or 1:3 -> gives length
a:c or 1:5 -> gives capacity我们可以从具有3个数字/索引的切片表达式中提取length和capacity,而无需查看源切片/数组。
expression| aSlice[low:high:max] or aSlice[a:b:c] or aSlice[1:3:7]
------------------------------------------------------------------------
Length | len(aSlice[low:high]) or len(aSlice[a:b]) or len(aSlice[1:3])
Capacity | len(aSlice[low:max]) or len(aSlice[a:c]) or len(aSlice[1:7])
------------------------------------------------------------------------点击Slice Expressions了解更多信息
发布于 2020-10-28 23:07:30
实际上,Go slice有一个指向数组的指针,它保存着数组的长度和容量,我们可以像下面这样显示它
指针:长度:容量
append用于添加相同的新长度。
sl1 := make([]int, 6)
fmt.Println(sl1)
sl2 := append(sl1, 1)
fmt.Println(sl2)[0 0 0 0 0 0]
[0 0 0 0 0 0 1]https://stackoverflow.com/questions/27938177
复制相似问题