我正在使用 9x9 二维数组的 slice 制作一个简单的数独游戏。我仍然刚开始使用 Golang 并且有一些 C++ 经验。我不断收到错误消息“无法将数独 [0:9][0](类型 [9]int)用作赋值中的类型 []int”。
var row1 []int = 数独[0][0:9] 该行正确地获取了二维数组第一行的值并将它们放入 row1 slice 中,但是使用 var col1 []int = Sudoku[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)
}
Playground :https://play.golang.org/p/Jk6sqqXR5VE
10:6: cannot use Sudoku[0:9][0] (type [9]int) as type []int in assignment
最佳答案
TLDR:在 Go 中,数组和 slice 并不完全相同。您不能将 slice 变量分配给数组值。
详细信息:
我们从
Sudoku [9][9]int
开始,变量是一个数组。有效行
var row1 []int = Sudoku[0][0:9]
:Sudoku[0]
返回Sudoku
索引 0 处的元素,它是一个数组[9]int
。假设我们称这个临时结果为temp
然后
temp[0:9]
返回temp
中索引 0 和 9(不包括)之间的元素 slice 。这就是为什么您可以将其分配给 slice 变量row1
现在麻烦行
var col1 []int = Sudoku[0:9][0]
。根据命名,我猜你的意图是返回Sudoku
数组的第一列 ?不幸的是,这就是发生的事情:Sudoku[0:9]
返回Sudoku
的索引 0 和 9(不包括)之间的元素 slice 。因为Sudoku
中的每个元素都是一个数组,所以这个temp
值实际上包含Sudoku
中类型为[][9 的所有行]int
.现在
类型的变量时,Go 会报错temp[0]
返回temp
的第一个元素,它实际上只是Sudoku
的第一行和类型数组[9]int
。因此,当您尝试将其分配给[]int
( slice )
所以如果 Sudoku 是一个矩阵
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 ]
关于arrays - 无法对二维数组的列进行 slice "cannot use Sudoku[0:9][0] (type [9]int) as type []int in assignment",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50029237/