登录
首页 >  Golang >  Go问答

无法正确生成多维数组切片

来源:stackoverflow

时间:2024-03-19 08:36:30 210浏览 收藏

在 Go 语言中,创建多维数组切片时,需要正确理解切片表达式的行为。使用 ma[:] 可以生成一个 [3]int32 数组切片,而 ma[:][:] 解析为 (ma[:])[:],它将 ma 上的切片表达式结果作为 slice expression,因此它也会生成一个 [3]int32 数组切片,与 ma[:] 相同。需要注意的是,Go 语言不支持多维切片表达式,需要根据实际需求仔细构造切片以获得预期的结果。

问题内容

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

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。怎么办?

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


正确答案


表达式 ma[:][:] 解析为 (ma[:])[:]。该表达式根据 ma 上的切片表达式的结果得出 slice expression。外部切片表达式是一个 noop。

Go 没有多维切片表达式。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《无法正确生成多维数组切片》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>