golang切片,用切片切片[a:b:c]

fze*_*igd 8 go slice

我读了切片使用和内部Slice and 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]))

}
Run Code Online (Sandbox Code Playgroud)

去游乐场的结果是这样的:

[b] 1 5
[b] 1 4
[b] 1 6
Run Code Online (Sandbox Code Playgroud)

我可以理解,第三个是关于容量的东西,但这个的确切含义是什么?
我是否会错过文档中的内容?

Von*_*onC 12

Go 1.2中引入了语法,正如我在" Golang中重新切片"中所提到的.
它在Full slice表达式中记录:

a[low : high : max]
Run Code Online (Sandbox Code Playgroud)

构造一个相同类型的切片,并且具有与简单切片表达式相同的长度和元素a[low : high].
此外,它通过将切片的容量设置为来控制生成的切片的容量max - low.
只能省略第一个索引; 它默认为0.

切片后a:

a := [5]int{1, 2, 3, 4, 5}
t := a[1:3:5]
Run Code Online (Sandbox Code Playgroud)

切片t具有类型[] int,长度2,容量4和元素

t[0] == 2
t[1] == 3
Run Code Online (Sandbox Code Playgroud)

该功能的设计文档具有以下理由:

例如,在自定义[]byte分配管理器中,有时可以将切片传递给调用者并且知道调用者不能编辑超出真实数组的给定子范围的值.

添加的append对语言做出这个有些更重要,因为append可以让程序员之间的覆盖项len,并cap没有意识到这一点,甚至提cap.


Rob*_*jan 8

在切片表达式中slice[a:b:c]aSlice[1:3:5]

a:b or 1:3 -> gives length
a:c or 1:5 -> gives capacity
Run Code Online (Sandbox Code Playgroud)

我们可以从具有 3 个数字/索引的切片表达式中提取lengthcapacity,而无需查看源切片/数组。

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])
------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

在切片表达式中阅读更多内容

操场