Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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 如何将二维数组分配给切片的切片?_Arrays_Go_Slice - Fatal编程技术网

Arrays 如何将二维数组分配给切片的切片?

Arrays 如何将二维数组分配给切片的切片?,arrays,go,slice,Arrays,Go,Slice,在以下代码中: package main import "fmt" func main() { fmt.Println("Simple array") arrayInt := []int{1, 2, 3, 4} fmt.Println(arrayInt, "\n") fmt.Println("Simple slice") sliceInt := arrayInt[:]

在以下代码中:

package main

import "fmt"

func main() {
    fmt.Println("Simple array")
    arrayInt := []int{1, 2, 3, 4}
    fmt.Println(arrayInt, "\n")

    fmt.Println("Simple slice")
    sliceInt := arrayInt[:]
    fmt.Println(sliceInt, "\n")

    fmt.Println("Array of arrays")
    twoDimArray := [3][4]int{
        {1, 1, 1, 1},
        {2, 2, 2, 2},
        {3, 3, 3, 3},
    }
    fmt.Println(twoDimArray, "\n")

    fmt.Println("Array of slices")
    var arrayOfSlice [3][]int
    for i, _ := range twoDimArray {
        arrayOfSlice[i] = twoDimArray[i][:]
    }
    fmt.Println(arrayOfSlice, "\n")

    fmt.Println("Slice of arrays")
    var sliceOfArrays [][4]int
    sliceOfArrays = twoDimArray[:]
    fmt.Println(sliceOfArrays, "\n")

    fmt.Println("Slice of slices")
    var sliceOfSlice [][]int

}

twoDimArray
需要分配给
sliceOfSlice
,而无需为
sliceOfSlice


如何将
twoDimArray
分配给
sliceOfSlice

twoDimArray
具有元素类型
[4]int
sliceOfSlice
具有元素类型
[]int
。这些类型不同,因此不能存在与
twoDimArray
共享备份数组的
sliceOfSlice
值。
twoDimArray
需要一个新的支持数组,但是它的元素可能是与
twoDimArray
的元素共享支持数组的切片值,或者更具体地说是将
twoDimArray
的元素作为其支持数组

您必须使用循环并对外部数组的每个数组元素进行切片,没有速记:

fmt.Println("Slice of slices")
var sliceOfSlice [][]int
sliceOfSlice = make([][]int, len(twoDimArray))
for i := range twoDimArray {
    sliceOfSlice[i] = twoDimArray[i][:]
}
fmt.Println(sliceOfSlice, "\n")
这将输出(在上尝试):


请参阅相关:

因此,如果我说
sliceOfSlice[0]=make([]int,4)
则为
sliceOfSlice[0]
创建基础数组(大小为4)。是吗?@overexchange是的,
make()
创建一个数组并将其切片。并返回引用在其中创建的数组的切片。在
sliceOfSlice=make([]]int,3)
之后,长度
len(sliceOfSlice[0])
和容量
len(sliceOfSlice[0])
为0。因此,将
twoDimArray[0][:]
分配给
sliceOfSlice[0]
会使用len和cap的新值设置切片描述符(属于
sliceOfSlice[0]
)。正确吗?@overexchange
make([][]int,3)
创建一个元素类型为
[]int
的切片,它将有3个元素,但所有元素都是元素类型的零值,即
nil
。因此,这个
make()
返回一个包含3个
nil
片的片
sliceOfSlice[0]=twoDimArray[0][:]
slices
twoDimArray[0]
并将此切片值分配给
sliceOfSlice[0]
。当您说syntax
twoDimArray[0][:]
切片时,此语法是否创建了一个临时切片描述符,而此临时文件描述符变为
sliceOfSlice[0]
。对吗?
Slice of slices
[[1 1 1 1] [2 2 2 2] [3 3 3 3]]