2013-03-25 99 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