首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Golang中重新切片切片

在Golang中重新切片切片
EN

Stack Overflow用户
提问于 2012-10-07 20:17:51
回答 2查看 20.2K关注 0票数 25

我最近学习了Go语言,现在我对以下代码感到困惑:

代码语言:javascript
复制
package main

import "fmt"

func main() {
    a := make([]int, 5)
    printSlice("a", a)
    b := make([]int, 0, 5)
    printSlice("b", b)
    c := b[:2]
    printSlice("c", c)
    d := c[2:5]
    printSlice("d", d)
}

func printSlice(s string, x []int) {
    fmt.Printf("%s len=%d cap=%d %v\n",
        s, len(x), cap(x), x)
}

结果是:

代码语言:javascript
复制
a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
c len=2 cap=5 [0 0] //why the capacity of c not 2 but 5 instead
d len=3 cap=3 [0 0 0]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-07 20:19:47

c是从数组b中获取的切片。这不是副本,而是b的前两个元素的窗口。

由于b的容量为5,因此c可以扩展到其他3个位置(实际上,它创建了一个新的片,但位于内存中的相同位置)。

片的最大容量是底层数组的容量减去数组中片的起始位置:

代码语言:javascript
复制
 array : [0 0 0 0 0 0 0 0 0 0 0 0]
 array :  <----   capacity   --->
 slice :     [0 0 0 0]
 slice :      <---- capacity ---> 

也许这个程序会更清楚地说明c和d只是b上的窗口:

代码语言:javascript
复制
func main() {
    b := make([]int, 0, 5)
    c := b[:2]
    d := c[1:5] // this is equivalent to d := b[1:5]
    d[0] = 1
    printSlice("c", c)
    printSlice("d", d)
}

输出:

代码语言:javascript
复制
c len=2 cap=5 [0 1] // modifying d has modified c
d len=4 cap=4 [1 0 0 0] 
票数 27
EN

Stack Overflow用户

发布于 2013-09-20 15:33:03

请注意,在go 1.2 (Q4 2013, 1.2rc1 is available now),中,您可以将其自身的容量(而不是从底层数组推导出的容量)关联到切片。

请参阅"Three-index slices“和design document

切片操作通过描述已创建的数组或切片的连续部分来创建新切片:

代码语言:javascript
复制
var array [10]int
slice := array[2:4]

切片的容量是切片可以容纳的最大元素数,即使在重新切片之后也是如此;它反映了基础数组的大小。

在此示例中,切片变量的容量为8。

(底层数组的容量减去数组中切片的起始位置)

代码语言:javascript
复制
array : [0 0 0 0 0 0 0 0 0 0]
 array : <---- capacity --->
 slice :    [0 0]
 slice :    <-- capacity --> 8 (10-2)

Go 1.2添加了新的语法,以允许切片操作来指定容量以及长度。

第二个冒号引入容量值,该值必须小于或等于源存储片或阵列的容量,并针对源进行调整。

例如,

代码语言:javascript
复制
slice = array[2:4:6]

array : [0 0 0 0 0 0 0 0 0 0]
 array : <---- capacity --->   10
 slice :    [0 0]
 slice :    <- cap->           4 (6-2)

将切片设置为与前面示例中的长度相同,但其容量现在只有4个元素(6-2)。

不可能使用这个新的切片值来访问原始数组的最后两个元素。

主要的论点是让程序员对有更多的控制。

代码语言:javascript
复制
a[i : j : k]

该切片具有:

从0开始的

  • 索引
  • 长度等于j - i
  • capacity等于k - i

如果 i <= j <= k <= cap(a) is 不是真的,则会导致评估死机。

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12768744

复制
相关文章

相似问题

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