2013-03-25 11 views
5

私は興味があります、どのように2d配列から列スライスを作成するのですか?2次元アレイからスライス列を移動しますか?

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

意味的にスライスインデックスは、0から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] 

あなたは完全な2Dスライスを返しx[0:2]、上記の例の2行目で見ることができるように。その結果、 最初の要素を取ると、その2dスライスの最初の行が返されます。

+0

ありがとうございました。これは役に立ちます。私は "行"と "列"が混在しているので、自分のコードを編集しました。 –

関連する問題