it-swarm.com.de

Richtige Methode zum Initialisieren eines leeren Slice

Um ein leeres Slice mit einer nicht festgelegten Größe zu deklarieren, ist es besser, Folgendes zu tun:

mySlice1 := make([]int, 0)

oder:

mySlice2 := []int{}

Ich frage mich nur, welcher der richtige Weg ist.

172
eouti

Die beiden Alternativen, die Sie angegeben haben, sind semantisch identisch, und ich gehe davon aus, dass sie die gleichen Montageanweisungen enthalten.

Um eine unnötige Zuordnung zu vermeiden, können Sie das Segment mit einem nil -Wert belassen, falls Sie es am Ende nicht verwenden:

var myslice []int

Wie im Golang.org-Blog geschrieben:

ein Null-Slice ist funktional äquivalent zu einem Null-Slice, obwohl es auf nichts verweist. Es hat die Länge Null und kann mit Zuweisung angehängt werden.

215
ANisus

Sie sind gleichwertig. Siehe diesen Code:

mySlice1 := make([]int, 0)
mySlice2 := []int{}
fmt.Println("mySlice1", cap(mySlice1))
fmt.Println("mySlice2", cap(mySlice2))

Ausgabe:

mySlice1 0
mySlice2 0

Beide Slices haben eine Kapazität von 0, was impliziert, dass beide Slices eine Länge von 0 haben (sie können nicht größer als die Kapazität sein), was impliziert, dass beide Slices keine Elemente haben. Dies bedeutet, dass die 2 Scheiben in jeder Hinsicht identisch sind.

Siehe ähnliche Fragen:

Was bringt es, wenn man in Golang keine und leere Scheiben hat?

Null-Slices gegen Nicht-Null-Slices gegen leere Slices in der Sprache Go

51
icza

Als Ergänzung zu @ ANisus ' Antwort ...

im Folgenden finden Sie einige Informationen aus dem Buch "Go in Action" , die meiner Meinung nach erwähnenswert sind:

Unterschied zwischen nil & empty Slices

Wenn wir an eine Scheibe wie diese denken:

[pointer] [length] [capacity]

dann:

nil slice:   [nil][0][0]
empty slice: [addr][0][0] // points to an address

keine Scheibe

Sie sind nützlich, wenn Sie ein nicht vorhandenes Slice darstellen möchten, z. B. wenn in einer Funktion, die ein Slice zurückgibt, eine Ausnahme auftritt.

// Create a nil slice of integers.
var slice []int

leere Scheibe

Leere Segmente sind nützlich, wenn Sie eine leere Sammlung darstellen möchten, z. B. wenn eine Datenbankabfrage keine Ergebnisse zurückgibt.

// Use make to create an empty slice of integers.
slice := make([]int, 0)

// Use a slice literal to create an empty slice of integers.
slice := []int{}

Unabhängig davon, ob Sie ein Null-Slice oder ein leeres Slice verwenden, funktionieren die integrierten Funktionen append, len und cap auf dieselbe Weise.


Spielplatzbeispiel :

package main

import (
    "fmt"
)

func main() {

    var nil_slice []int
    var empty_slice = []int{}

    fmt.Println(nil_slice == nil, len(nil_slice), cap(nil_slice))
    fmt.Println(empty_slice == nil, len(empty_slice), cap(empty_slice))

}

druckt:

true 0 0
false 0 0
33
tgogos

Leeres Slice und Null-Slice werden in Go unterschiedlich initialisiert:

var nilSlice []int 
emptySlice1 := make([]int, 0)
emptySlice2 := []int{}

fmt.Println(nilSlice == nil)    // true
fmt.Println(emptySlice1 == nil) // false
fmt.Println(emptySlice2 == nil) // false

Wie für alle drei Scheiben sind len und cap 0.

12
Joe.CK