2017-11-29 2 views
-1

Ich versuche, ein 2D-Schnitt in Go zu erstellen und zu initialisieren. Während die folgende Funktion funktioniert ohne Probleme:Fehler beim Erstellen eines 2D-Schnitts

func working2D() [][]uint8 { 
    p := make([][]uint8, 2) 
    for i:=range p{ 
     p[i]=make([]uint8, 8) 
     for j:=range p[i]{ 
      p[i][j]=uint8(j) 
     } 
    } 
    fmt.Println(p) 
    return p 
} 

Output: [[0 1 2 3 4 5 6 7] [0 1 2 3 4 5 6 7]]

Aber die folgende Funktion kompilieren nicht einmal und wirft einen Kompilierungsfehler:

sample/main/range.go:35:9: v2 declared and not used

func notWorking2D() [][]uint8 { 
    p := make([][]uint8, 1) 
    for _,v := range p { 
     v = make([]uint8, 8) 
     for j, v2 := range v { 
      v2 = uint8(j) 
     } 
    } 
    fmt.Println(p) 
    return p 
} 

Output: [[],[]]

Was ist es, Ich vermisse die zweite Funktion?

+0

Die zweite Variable in einem 'Bereich' wird auf jeden Wert im Slice gesetzt, wenn die Schleife iteriert. Die Zuordnung zu dieser Variablen wirkt sich nicht auf das Segment aus. –

+0

danke für die Klarstellung @AndySchweig. – shoki

Antwort

1

Wie gesagt Andy in einem Kommentar:

The second variable in a range gets set to each value in the slice as the loop iterates. Assigning to that variable does not affect the slice.

Sie wahrscheinlich nur tun wollen:

func notWorking2D() [][]uint8 { 
    p := make([][]uint8, 2) 
    for i, _ := range p {  
     p[i] = make([]uint8, 8) 
     for j, _ := range p[i] { 
      p[i][j] = uint8(j) 
     } 
    } 
    return p 
} 

https://play.golang.org/p/cHQc9ReJBE

+0

Danke für deine Zeit dave. Ja, Andy hatte meine Frage beantwortet – shoki

0

Es Gehe wieder keine 2d Scheibe‘.

Sie können ein "Slice of Slices" erstellen. Dies hat einen Nachteil, da Sie jeden "subslice" manuell initialisieren müssen.

Gibt auch Spielzeug mehr Flexibilität, da jede bestimmte Scheibe seine eigene Länge und Kapazität haben kann.

func slice2(n int) [][]int { 
    Result := make([][]int, 0, n) 
    for i:=0; i<n; i++ { 
     Result = append(Result, make([]int)) 
    } 
    return Result 
} 
Verwandte Themen