9

我很好奇,你如何从二维数组创建列切片?

我有一个用于井字游戏棋盘的数组,我正在尝试创建一个列切片,但我的切片结果相同。

/* 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]

我怎么做这个切片?

4

1 回答 1

7

切片语法无法实现您想要做的事情。您认为这x[i][0:n]将使您获得 row 的所有列i。它实际上所做的是将列返回0nfrom 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 切片的第一行。

于 2013-03-25T15:33:31.080 回答