首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >golang切片,使用切片切片[a:b:c]

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

Stack Overflow用户
提问于 2015-01-14 15:55:44
回答 3查看 20K关注 0票数 36

我读了go slice usage and internalsSliceEffective go#slice,但没有像这样的3数字切片:slice[a:b:c]

例如下面的代码:

代码语言:javascript
复制
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结果是这样的:

代码语言:javascript
复制
[b] 1 5
[b] 1 4
[b] 1 6

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

我在文档中遗漏了什么吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-14 16:34:40

正如我在"Re-slicing slices in Golang“中提到的,该语法已在Go 1.2中引入。

它在Full slice expressions中进行了记录

代码语言:javascript
复制
a[low : high : max]

构造了一个与简单切片表达式a[low : high]具有相同长度和相同元素的类型相同的切片。

此外,它通过将其设置为max - low来控制结果切片的容量。

只能省略第一个索引,默认为0。

对数组a进行切片后:

代码语言:javascript
复制
a := [5]int{1, 2, 3, 4, 5}
t := a[1:3:5]

切片t的类型为[]int,长度为2,容量为4,元素为

代码语言:javascript
复制
t[0] == 2
t[1] == 3

该功能的design document有以下理由:

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

因为append len允许程序员在没有意识到甚至没有提到cap cap.的情况下覆盖 made 之间的条目,所以在语言中添加使这一点变得更加重要

票数 39
EN

Stack Overflow用户

发布于 2020-09-18 05:52:53

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

代码语言:javascript
复制
a:b or 1:3 -> gives length
a:c or 1:5 -> gives capacity

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

代码语言:javascript
复制
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了解更多信息

Playground

票数 2
EN

Stack Overflow用户

发布于 2020-10-28 23:07:30

实际上,Go slice有一个指向数组的指针,它保存着数组的长度和容量,我们可以像下面这样显示它

指针:长度:容量

append用于添加相同的新长度。

代码语言:javascript
复制
    sl1 := make([]int, 6)
    fmt.Println(sl1)

    sl2 := append(sl1, 1)
    fmt.Println(sl2)
代码语言:javascript
复制
[0 0 0 0 0 0]
[0 0 0 0 0 0 1]
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27938177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档