为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕莱坞森 2021-09-10 21:03:04
我阅读了go slice usage and internals和Slice and Effective go#slice但没有像这样用 3 个数字切片切片:slice[a:b:c]例如这个代码:package mainimport "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我可以理解第三个是关于容量的,但它的确切含义是什么?我是否遗漏了文档中的某些内容?
查看完整描述

3 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

该语法已在 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] == 2

t[1] == 3

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


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


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


查看完整回答
反对 回复 2021-09-10
?
MYYA

TA贡献1868条经验 获得超4个赞

实际上 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]


查看完整回答
反对 回复 2021-09-10
  • 3 回答
  • 0 关注
  • 262 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信