2014-08-28 7 views
44

In Golang, was ist der Unterschied zwischen var s []int und s := make([]int, 0)?Scheibe deklarieren oder Scheibe machen?

Ich finde, dass beide funktioniert, aber welche ist besser?

+0

Der erste erstellt einen "nil" Schnitt, während der zweite einen "leeren" Schnitt erstellt (dies ist die Terminologie, die vom * "In Action Book" *) verwendet wird. Um zu vermeiden, die gleiche Antwort auch hier zu posten, können Sie https://stackoverflow.com/a/45997533/1561148 – tgogos

Antwort

46

Neben fabriziom ‚s answer, können Sie weitere Beispiele bei‚Go Slices: usage and internals‘sehen, wo eine Verwendung für []int erwähnt wird:

Da der Nullwert von einer Scheibe (nil) wirkt wie ein Null-Länge Scheibe, können Sie eine Scheibe Variable deklarieren und dann, um es in einer Schleife anhängen:

// Filter returns a new slice holding only 
// the elements of s that satisfy f() 
func Filter(s []int, fn func(int) bool) []int { 
    var p []int // == nil 
    for _, v := range s { 
     if fn(v) { 
      p = append(p, v) 
     } 
    } 
    return p 
} 

es mir ans, dass, um an ein Slice anzuhängen, müssen Sie nicht zuerst Speicher reservieren: das nil Slice p int[] ist genug als ein Slice zum Hinzufügen.

+0

Danke! Das ist das, was ich benötige. –

55

einfache Erklärung

var s []int 

nicht-Speicher und s Punkte auf nil zuteilt, während

s := make([]int, 0) 

Speicher und s Punkte in den Speicher mit 0 Elementen einer Scheibe zuweist.

Normalerweise ist die erste Sprache idiomatischer, wenn Sie die genaue Größe Ihres Anwendungsfalls nicht kennen.

+0

Kann ich das gleiche für die Karte sagen? var m map [string] int vs. m: = make (map [string] int)? Vielen Dank. – joshua

+7

Nein, Sie müssen Karten erstellen, denn selbst eine leere Karte benötigt Platz für die Buchhaltung. – twotwotwo

+5

Wenn Sie eine Scheibe mit 0 Elementen (anstelle von 'Null') zurückgeben müssen, ist make die richtige Verwendung. – Jess