func main() {
a := []string{"Hello1", "Hello2", "Hello3"}
fmt.Println(a)
// [Hello1 Hello2 Hello3]
a = append(a[:0], a[1:]...)
fmt.Println(a)
// [Hello2 Hello3]
}
Wie funktioniert dieser Löschtrick mit der Append-Funktion?
Es scheint, dass es alles vor dem ersten Element (leeres Array) erfasst.
Dann alles nach dem ersten Element anhängen (Position Null)
Was macht der ... (Punkt Punkt Punkt)?
...
wird dort ausführlich erklärt?Antworten:
Wo
a
ist das Slice undi
der Index des Elements, das Sie löschen möchten:...
ist die Syntax für verschiedene Argumente in Go.Grundsätzlich werden beim Definieren einer Funktion alle Argumente, die Sie übergeben, in einem Slice dieses Typs zusammengefasst. Auf diese Weise können Sie so viele Argumente übergeben, wie Sie möchten (z. B.
fmt.Println
können Sie so viele Argumente verwenden, wie Sie möchten).Wenn Sie eine Funktion aufrufen ,
...
geschieht das Gegenteil: Sie entpackt ein Slice und übergibt es als separate Argumente an eine variable Funktion.Also, was diese Zeile macht:
Ist im Wesentlichen:
Nun fragen Sie sich vielleicht, warum nicht einfach
Nun, die Funktionsdefinition von
append
istDas erste Argument muss also ein Slice des richtigen Typs sein, das zweite Argument ist das Variadic. Wir übergeben also ein leeres Slice und entpacken dann den Rest des Slice, um die Argumente auszufüllen.
quelle
a = append(a[:i], a[i+1:]...)
Es gibt zwei Möglichkeiten:
A: Sie möchten die Array-Reihenfolge beibehalten:
B: Es ist Ihnen egal, ob Sie die Ordnung aufrechterhalten (dies ist wahrscheinlich schneller):
Unter dem Link erfahren Sie, welche Auswirkungen Speicherlecks haben, wenn Ihr Array Zeiger enthält.
https://github.com/golang/go/wiki/SliceTricks
quelle
Stellen Sie sich die Indizes in den
[a:]
-,[:b]
- und[a:b]
-Notationen nicht als Elementindizes vor, sondern als Indizes der Lücken um und zwischen den Elementen, beginnend mit der Lücke, die0
vor dem als indizierten Element indiziert wurde0
.Wenn man nur die blauen Zahlen betrachtet, ist es viel einfacher zu sehen, was los ist:
[0:3]
schließt alles ein,[3:3]
ist leer und[1:2]
würde nachgeben{"B"}
. Dann[a:]
ist nur die Kurzversion von[a:len(arrayOrSlice)]
,[:b]
die Kurzversion von[0:b]
und[:]
die Kurzversion von[0:len(arrayOrSlice)]
. Letzteres wird üblicherweise verwendet, um ein Array bei Bedarf in ein Slice umzuwandeln.quelle
... ist die Syntax für verschiedene Argumente.
Ich denke, es wird vom Complier mithilfe von Slice implementiert (
[]Type)
genau wie die Funktion append:Wenn Sie "elems" in "append" verwenden, handelt es sich tatsächlich um einen Slice-Typ ([]). "
a = append(a[:0], a[1:]...)
" Bedeutet also "a = append(a[0:0], a[1:])
"a[0:0]
ist eine Scheibe, die nichts hata[1:]
ist "Hello2 Hello3"So funktioniert es
quelle
a[0:0]
ist nichtnil
nur ein Slice mit 0 Länge.a[0:0]
wird nur sein,nil
wenna
istnil
.Ich erhalte einen Indexfehler außerhalb des Bereichs mit der akzeptierten Antwortlösung. Grund: Wenn der Bereich beginnt, wird der Wert nicht einzeln iteriert, sondern nach Index iteriert. Wenn Sie ein Slice geändert haben, während es sich in Reichweite befindet, tritt ein Problem auf.
Alte Antwort:
Erwartet :
Tatsächlich:
Richtiger Weg (Lösung):
Quelle: https://dinolai.com/notes/golang/golang-delete-slice-item-in-range-problem.html
quelle
In Golangs Wiki werden einige Tricks für Slice gezeigt, darunter das Löschen eines Elements aus Slice.
Link: Geben Sie hier die Linkbeschreibung ein
Zum Beispiel ist a das Slice, in dem Sie das Element Nummer i löschen möchten.
ODER
quelle