代码之家  ›  专栏  ›  技术社区  ›  Zbadrawy

无法对2d数组的列进行切片“不能将数独[0:9][0](类型[9]int)用作赋值中的类型[]int”

  •  -2
  • Zbadrawy  · 技术社区  · 7 年前

    我正在用9x9 2d数组的切片制作一个简单的数独游戏。我还是从Golang开始,有一些C++经验。我不断收到错误消息“无法将数独[0:9][0](键入[9]int)用作赋值中的[]int类型”。

    var row1[]int=数独[0][0:9] 这一行正确地获取了2d数组第一行的值,并将其放置到row1切片中,但使用var col1[]int=数独[0:9][0]会导致上面的错误消息。我能做什么?提前感谢!

    例如

    package main
    
    import "fmt"
    
    func main() {
        var Sudoku [9][9]int
        fmt.Println(Sudoku)
        var row1 []int = Sudoku[0][0:9]
        fmt.Println(row1)
        var col1 []int = Sudoku[0:9][0]
        fmt.Println(col1)
    }
    

    操场: https://play.golang.org/p/Jk6sqqXR5VE

    10:6: cannot use Sudoku[0:9][0] (type [9]int) as type []int in assignment
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   lvtien    3 年前

    TLDR:在Go中,数组和切片并不完全相同。不能将切片变量分配给数组值。

    详细信息:

    1. 我们从 Sudoku [9][9]int 变量是数组。

    2. 有效行 var row1 []int = Sudoku[0][0:9] :

    3. Sudoku[0] 返回索引0处的元素 Sudoku ,它是一个数组 [9]int .我们称之为临时结果 temp

    4. 然后 temp[0:9] 返回中索引0和9(互斥)之间的元素片段 临时雇员 。这就是为什么可以将其分配给slice变量 row1

    5. 现在是故障线路 var col1 []int = Sudoku[0:9][0] .根据命名,我猜您的目的是返回 数独游戏 大堆 ?不幸的是,情况就是这样:

    6. Sudoku[0:9] 返回索引0和9(不包括)之间的元素片段 数独游戏 .因为 数独游戏 是一个数组 临时雇员 值实际上包含 数独游戏 和类型 [][9]int

    7. 现在 temp[0] 返回的第一个元素 临时雇员 ,这实际上只是 数独游戏 数组类型的and [9] 内景 。因此,当您尝试将Go分配给类型为的变量时,Go会抱怨 []int (一片)

    所以如果数独是一个矩阵

    1 1 1 1 1 1 1 1 1
    2 2 2 2 2 2 2 2 2
    ...
    9 9 9 9 9 9 9 9 9
    

    即使Go没有抱怨键入,返回的值也会 [1 1 1 1 1 1 1 1 1] 而不是 [1 2 3 4 5 6 7 8 9]

        2
  •  0
  •   nojo    7 年前

    var col1 []int = Sudoku[0:9][0] 获取数组,而不是切片。您可以声明为 var col1 [9]int = Sudoku[0:9][0] (或更好: col1 := Sudoku[0:9][0] ),或者如果您真的想要切片: var col1Slice []int = col1[:] 在获得col1之后。

    一般来说,如果你的数独结构是一个2D切片而不是2D数组,那么你只需要处理切片,事情就会简单得多。

    所有这些的工作示例: https://play.golang.org/p/LE8qwFSy1m_e