我很好奇,你如何从二维数组创建一个列切片?我有一个用于 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]我如何制作这个切片?
1 回答
温温酱
TA贡献1752条经验 获得超4个赞
切片语法无法实现您想要做的事情。您认为这x[i][0:n]将为您提供 row 的所有列i。它实际上做的是将列返回0到nfrom row i。
您必须使用循环来获取一列:
func boardColumn(board [][]char, columnIndex int) (column []char) {
column = make([]char, 0)
for _, row := range board {
column = append(column, row[columnIndex])
}
return
}
您用“行”标记的代码实际上是我希望提供列的代码:
win[i] = check(BOARD[0:SIZE][i])
从语义上讲,切片索引表示:将i所有元素的第 th 个元素从零到 SIZE。但是,如前所述,Go 切片的工作方式不同。自己试试:
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 切片。因此,取第一个元素返回该二维切片的第一行。
- 1 回答
- 0 关注
- 253 浏览
添加回答
举报
0/150
提交
取消