2013-03-25 130 views
5

我很好奇,你如何创建一个2d数组的列切片?从2d数组转换lang切片列?

我有一个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] 

回报我如何做这个切片?

回答

5

你想要做的是切片语法不可能做到的。您认为x[i][0:n]将会为您带来所有第i列。它实际上做的是从行i返回列0n

你必须使用一个循环得到一个列:

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]) 

在语义上,切片索引表示:从零到SIZE的所有元素的第i个元素。但是,正如已经提到的,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]返回完整的二维切片。因此,取得第一个元素的 返回该第二个切片的第一行。

+0

非常感谢。这有助于。我编辑我的代码,因为我混合了“行”和“列”。 – 2013-03-25 16:01:49