从2d数组去lang切片列?

时间:2013-03-25 15:02:26

标签: go multidimensional-array slice

我很好奇,你如何从二维阵列创建一个列切片?

我有一个用于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 个答案:

答案 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切片。所以 取第一个元素将返回该第二个切片的第一行。