Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Golang重新切片_Arrays_Slice - Fatal编程技术网

Arrays 在Golang重新切片

Arrays 在Golang重新切片,arrays,slice,Arrays,Slice,我最近学习了Go语言,现在我对以下代码感到困惑: 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 p

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

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)
}
结果是:

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]

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

由于
b
的容量为5,
c
可以扩展到其他3个位置(实际上,它生成一个新的片,但位于内存中的同一位置)

切片的最大容量是基础数组的容量减去切片在数组中的起始位置:

 array : [0 0 0 0 0 0 0 0 0 0 0 0]
 array :  <----   capacity   --->
 slice :     [0 0 0 0]
 slice :      <---- capacity ---> 
输出:

c len=2 cap=5 [0 1] // modifying d has modified c
d len=4 cap=4 [1 0 0 0] 
请注意,在go 1.2()中,可以将其自身的容量(而不是从底层数组推断的容量)关联到一个片

请参阅“”,以及

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

片的容量是片可以容纳的最大元素数,即使在重新选择后也是如此;它反映了基础数组的大小。
在本例中,slice变量的容量为8

(基础阵列的容量减去阵列中切片起始位置)

该片有:

  • 从0开始的索引
  • 长度等于
    j-i
  • 容量等于
    k-i

如果
我感谢你的帮助性回答,那么评估就会恐慌。那么b也会受到影响吗?是的。但是你看不到它,因为长度是0。具有自身容量的切片即将出现(go 1.2)。看见
c len=2 cap=5 [0 1] // modifying d has modified c
d len=4 cap=4 [1 0 0 0] 
var array [10]int
slice := array[2:4]
array : [0 0 0 0 0 0 0 0 0 0]
 array : <---- capacity --->
 slice :    [0 0]
 slice :    <-- capacity --> 8 (10-2)
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)
a[i : j : k]