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]
)。正确吗?@overexchangemake([][]int,3)
创建一个元素类型为[]int
的切片,它将有3个元素,但所有元素都是元素类型的零值,即nil
。因此,这个make()
返回一个包含3个nil
片的片sliceOfSlice[0]=twoDimArray[0][:]
slicestwoDimArray[0]
并将此切片值分配给sliceOfSlice[0]
。当您说syntaxtwoDimArray[0][:]
切片时,此语法是否创建了一个临时切片描述符,而此临时文件描述符变为sliceOfSlice[0]
。对吗?
Slice of slices
[[1 1 1 1] [2 2 2 2] [3 3 3 3]]