猿问

从二维数组中获取 lang 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]

我如何制作这个切片?


阿晨1998
浏览 254回答 1
1回答

温温酱

切片语法无法实现您想要做的事情。您认为这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 切片。因此,取第一个元素返回该二维切片的第一行。
随时随地看视频慕课网APP

相关分类

Go
我要回答