无法对二维数组的列进行切片 "cannot use Sudoku[0:9][0] (type [9]int) as type []int in assignment"
Can't make a slice of a column of a 2d array "cannot use Sudoku[0:9][0] (type [9]int) as type []int in assignment"
我正在使用 9x9 二维数组的切片制作一个简单的数独游戏。我仍然刚开始使用 Golang 并且有一些 C++ 经验。我不断收到错误消息 "cannot use Sudoku[0:9][0] (type [9]int) as type []int in assignment".
var row1 []int = 数独[0][0:9]
该行正确地获取了二维数组第一行的值并将它们放入 row1 切片中,但是使用 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)
}
游乐场:https://play.golang.org/p/Jk6sqqXR5VE
10:6: cannot use Sudoku[0:9][0] (type [9]int) as type []int in assignment
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.
之后
一般来说,如果您的数独结构是二维切片而不是二维数组,事情会容易得多,那么您将只处理切片。
所有这些的工作示例:
https://play.golang.org/p/LE8qwFSy1m_e
TLDR:在 Go 中,数组和切片并不完全相同。您不能将切片变量分配给数组值。
详情:
我们开始Sudoku [9][9]int
变量是一个数组
有效行var row1 []int = Sudoku[0][0:9]
:
Sudoku[0]
returns Sudoku
的索引 0 处的元素,它是一个数组 [9]int
。假设我们称这个临时结果为 temp
然后temp[0:9]
return是temp
中索引0到9(不包括)之间的一片元素。这就是为什么您可以将其分配给切片变量 row1
现在麻烦在线var col1 []int = Sudoku[0:9][0]
。根据命名,我猜你的意图是 return Sudoku
数组的第一列
?不幸的是,事情是这样的:
Sudoku[0:9]
returns Sudoku
的索引 0 和 9(不包括)之间的元素切片。因为 Sudoku
中的每个元素都是一个数组,所以这个 temp
值实际上包含来自 Sudoku
且类型为 [][9]int
.
的所有行
现在temp[0]
return是temp
的第一个元素,实际上就是Sudoku
的第一行,类型是数组[9]int
。因此,当您尝试将其分配给 []int
(切片)
类型的变量时,Go 会报错
所以如果数独是
的矩阵
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 不抱怨输入,returned 值也将是 [1 1 1 1 1 1 1 1 1]
而不是 [1 2 3 4 5 6 7 8 9]
我正在使用 9x9 二维数组的切片制作一个简单的数独游戏。我仍然刚开始使用 Golang 并且有一些 C++ 经验。我不断收到错误消息 "cannot use Sudoku[0:9][0] (type [9]int) as type []int in assignment".
var row1 []int = 数独[0][0:9] 该行正确地获取了二维数组第一行的值并将它们放入 row1 切片中,但是使用 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)
}
游乐场:https://play.golang.org/p/Jk6sqqXR5VE
10:6: cannot use Sudoku[0:9][0] (type [9]int) as type []int in assignment
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.
一般来说,如果您的数独结构是二维切片而不是二维数组,事情会容易得多,那么您将只处理切片。
所有这些的工作示例: https://play.golang.org/p/LE8qwFSy1m_e
TLDR:在 Go 中,数组和切片并不完全相同。您不能将切片变量分配给数组值。
详情:
我们开始
Sudoku [9][9]int
变量是一个数组有效行
var row1 []int = Sudoku[0][0:9]
:Sudoku[0]
returnsSudoku
的索引 0 处的元素,它是一个数组[9]int
。假设我们称这个临时结果为temp
然后
temp[0:9]
return是temp
中索引0到9(不包括)之间的一片元素。这就是为什么您可以将其分配给切片变量row1
现在麻烦在线
var col1 []int = Sudoku[0:9][0]
。根据命名,我猜你的意图是 returnSudoku
数组的第一列 ?不幸的是,事情是这样的:
的所有行Sudoku[0:9]
returnsSudoku
的索引 0 和 9(不包括)之间的元素切片。因为Sudoku
中的每个元素都是一个数组,所以这个temp
值实际上包含来自Sudoku
且类型为[][9]int
.现在
类型的变量时,Go 会报错temp[0]
return是temp
的第一个元素,实际上就是Sudoku
的第一行,类型是数组[9]int
。因此,当您尝试将其分配给[]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 不抱怨输入,returned 值也将是 [1 1 1 1 1 1 1 1 1]
而不是 [1 2 3 4 5 6 7 8 9]