2013-03-25 19 views
5

Ich bin neugierig, wie erstellen Sie eine Spalte Slice von einem 2d-Array?Go lang Slice-Spalten aus 2D-Array?

Ich habe ein Array für ein Spielbrett für Tic-Tac-Toe, und ich versuche, eine Spalte Scheibe zu erstellen, aber meine Scheiben kommen identisch heraus.

/* 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 "-" 
} 

Ich gebe es die folgende Eingabe:

[E E E E] 
[E E E E] 
[X O E E] 
[X O E E] 

Und ich bekomme eine Rendite von

Row 
[X O E E] 
Column 
[X O E E] 

Aber ich will eine Rückkehr von

Row 
[X O E E] 
Column 
[E E X X] 

Wie ich tun mach diese Scheibe?

Antwort

5

Was Sie tun möchten, ist mit der Slice-Syntax nicht möglich. Sie denken, dass x[i][0:n] Sie alle Spalten der Zeile i erhalten wird. Tatsächlich werden die Spalten 0 von der Zeile i in n zurückgegeben.

Sie haben eine Schleife verwenden, um eine Spalte zu erhalten:

func boardColumn(board [][]char, columnIndex int) (column []char) { 
    column = make([]char, 0) 
    for _, row := range board { 
     column = append(column, row[columnIndex]) 
    } 
    return 
} 

Der Code, den Sie mit ‚Row‘ beschriften tatsächlich der Code ich erwartet hätte die Spalten liefern:

win[i] = check(BOARD[0:SIZE][i]) 

Semantisch sagen die Scheibenindizes: nimm das i te Element aller Elemente von Null bis SIZE. Aber wie bereits erwähnt, funktionieren Go-Slices anders. 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] 

Wie Sie oben in Zeile zwei des Beispiels sehen können, x[0:2] gibt die vollständige 2D-Scheibe. Folglich gibt unter Verwendung des ersten Elements die erste Zeile dieses 2d-Slices zurück.

+0

Vielen Dank. Das hilft. Ich habe meinen Code bearbeitet, weil ich "Zeilen" und "Spalten" verwechselt habe. –