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

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


}

去游乐场结果是这样的:


[b] 1 5

[b] 1 4

[b] 1 6

我可以理解第三个是关于容量的,但它的确切含义是什么?

我是否遗漏了文档中的某些内容?


慕莱坞森
浏览 269回答 3
3回答

慕慕森

该语法已在 Go 1.2 中引入,正如我在“在 Golang 中重新切片切片”中提到的。它记录在完整切片表达式中: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] == 2t[1] == 3该功能的设计文档具有以下理由:有时,例如在自定义[]byte分配管理器中,能够将切片传递给调用者并知道调用者无法编辑超出真实数组给定子范围的值会很有用。添加的append对语言做出这个有些更重要,因为append可以覆盖之间的条目的程序员len,并cap没有意识到这一点,甚至提cap。

MYYA

实际上 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]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go