我很好奇,你如何从二维阵列创建一个列切片?
我有一个用于Tic-Tac-Toe游戏板的数组,我正在尝试创建一个列切片,但我的切片是相同的。
/* Just trying to get rows and columns working first */
func() isWin() bool {
win := make([]char, SIZE*2)
for i:= range BOARD {
fmt.Println("Row")
win[i] = check(BOARD[i][0:SIZE])
fmt.Println("Column")
win[i+SIZE] = check(BOARD[0:SIZE][i])
}
return false
}
func() check(slice []char) (char) {
fmt.Println(slice)
return "-"
}
我给它以下输入:
[E E E E]
[E E E E]
[X O E E]
[X O E E]
我得到了回复
Row
[X O E E]
Column
[X O E E]
但我想要回归
Row
[X O E E]
Column
[E E X X]
如何制作此片?
答案 0 :(得分:5)
使用切片语法无法实现您想要做的事情。您认为x[i][0:n]
会获取行i
的所有列。它实际上做的是将0
列从行n
返回到i
。
您必须使用循环来获取列:
func boardColumn(board [][]char, columnIndex int) (column []char) {
column = make([]char, 0)
for _, row := range board {
column = append(column, row[columnIndex])
}
return
}
您使用'Row'标记的代码实际上是我希望提供列的代码:
win[i] = check(BOARD[0:SIZE][i])
语义上切片索引说:将所有元素的i
元素从零变为SIZE。
但是,如前所述,Go切片的工作方式不同。 Try for yourself:
x := [][]int{{1,2,3},{4,5,6}}
fmt.Println(x[0:2]) // [[1,2,3],[4,5,6]]
fmt.Println(x[0:2][0]) // [1,2,3]
正如您在上面示例的第二行中所看到的,x[0:2]
返回完整的2d切片。所以
取第一个元素将返回该第二个切片的第一行。