it-swarm.com.de

Slice deklarieren oder Slice machen?

Was ist in Golang der Unterschied zwischen var s []int Und s := make([]int, 0)?

Ich finde, dass beides funktioniert, aber welches ist besser?

83
Wang Yi

Zusätzlich zu fabriziom 's answer finden Sie weitere Beispiele unter " Go Slices: usage and internals ", wo eine Verwendung für []int wird genannt:

Da sich der Nullwert eines Slice (nil) wie ein Slice mit der Länge Null verhält, können Sie eine Slice-Variable deklarieren und dann anhängen dazu in einer Schleife:

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

Dies bedeutet, dass Sie zum Anhängen an ein Slice nicht zuerst Speicher zuweisen müssen: das nil slice p int[] reicht als Slice zum Hinzufügen.

84
VonC

Einfache Erklärung

var s []int

reserviert keinen Speicher und s zeigt auf nil, während

s := make([]int, 0)

weist einem Slice mit 0 Elementen Speicher zu und s verweist auf den Speicher.

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

96
fabrizioM

Fand gerade einen Unterschied. Wenn du benutzt

var list []MyObjects

wenn Sie die Ausgabe als JSON kodieren, erhalten Sie null.

list := make([]MyObjects, 0)

ergebnisse in [] wie erwartet.

3
Steve Hanov

Ein bisschen vollständiger (ein weiteres Argument in make) Beispiel:

slice := make([]int, 2, 5)
fmt.Printf("lenght:  %d - capacity %d - content:  %d", len(slice), cap(slice), slice)

Aus:

lenght:  2 - capacity 5 - content:  [0 0]

Oder mit dynamischem Typ von slice:

slice := make([]interface{}, 2, 5)
fmt.Printf("lenght:  %d - capacity %d - content:  %d", len(slice), cap(slice), slice)

Aus:

lenght:  2 - capacity 5 - content:  [<nil> <nil>]
3
Benyamin Jafari