我读了go slice usage and internalsSliceEffective 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]))

}

结果是:

[b] 1 5
[b] 1 4
[b] 1 6

我可以理解第三个问题是关于容量的,但是这是什么意思呢?
我在文件中遗漏了什么吗?

推荐答案

该语法已在GO 1.2中引入,正如我在"Re-slicing slices in Golang"中提到的.
它记录在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使这一点变得更加重要,因为100 lets programmers overwrite entries between 102 and 103 without realizing it or even mentioning 103.

Go相关问答推荐

Go - os.userHomeDir()在WSL上返回C:\Users\

Go Net/http路由

如何用Golang解码这个嵌套的json?

Docker Compose Health Check未退出,错误为无法启动

理解Golang中的IOTA和常量

优化方式中所有可能组合的字符串相似度

将文本文件放入切片然后进行比较

将 struct 转换为 CSV 字符串

helm :将 YAML 转换为 JSON 时出错:yaml:第 xx 行:未找到预期的密钥

使用 Grafana alert 在几分钟内重复alert

Go:从 ssl 证书中获取 'subject/unstructeredName' 的值

在恒等函数中将类型 T 转换为类型 U

函数超时和 goroutine 泄漏

在 Go 中读取数字行

无法建立连接,因为目标机器主动拒绝它 Golang

golang jwt.MapClaims 获取用户ID

Go 导入范围查找 protobuf 类型

gqlgen go,通过添加一个解析器来减少数据库调用

如何正确判断 io.Reader 是否为零?

正则表达式处理数字签名的多个条目