从多维数组制作多维切片无法按预期工作

我正在尝试从多维数组创建多维切片,并且发生了一些奇怪的事情(至少对我而言)。我创建了一个多维数组并从中ma制作了三个切片s1, s2, 。s3下面的代码显示了这一点:


package main


import (

    "fmt"

)


func main() {

    var ma [4][3]int32 = [4][3]int32{

        {10, 20, 30},

        {50, 60, 70},

        {80, 90, 100},

        {110, 120, 130},

    }


    var s1 [][3]int32 = ma[:]       // expected


    var s2 [][3]int32 = ma[:][:]    // ????


    var s3 [][]int32 = ma[0:2][0:2] // ????

}

var s1 [][3]int32 = ma[:]行为符合预期。ma[:]创建一个 [3]int32 数组的切片,因此我们有一个底层数组,其中每个元素都是 [3]int32 数组类型。完全符合我的预期行为。


定义 s1 和 s2 时会出现问题。它的行为不像我预期的那样。var s2 [][3]int32 = ma[:][:]给出与 相同的结果var s1 [][3]int32 = ma[:]。我希望它能制作一片切片,而不是一片数组。这怎么可能?两者怎么会给出相同的结果呢?


此外,我var s3 [][]int32 = ma[0:2][0:2]还希望创建一片切片。相反,它给出了错误“不能在变量声明编译器中使用 ma[0:2][0:2]([][3]int32 类型的值)作为 [][]int32 值”。所以不知何故,ma[0:2][0:2]它给出了类型[][3]int32,而不是[][]int32。如何?


我希望我已经解释了我不清楚的地方。


慕妹3242003
浏览 127回答 1
1回答

ITMISS

表达式ma[:][:]解析为(ma[:])[:]. 该表达式的计算结果为一个切片表达式,该切片表达式基于 上的切片表达式的结果ma。外部切片表达式是一个 noop。Go 没有多维切片表达式。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go