fmt.Println("Enter position to delete::")
fmt.Scanln(&pos)
new_arr := make([]int, (len(arr) - 1))
k := 0
for i := 0; i < (len(arr) - 1); {
if i != pos {
new_arr[i] = arr[k]
k++
i++
} else {
k++
}
}
for i := 0; i < (len(arr) - 1); i++ {
fmt.Println(new_arr[i])
}
Ich verwende diesen Befehl, um ein Element aus einem Slice zu löschen, aber es funktioniert nicht. Bitte schlagen Sie vor.
Antworten:
Ordnung ist wichtig
Wenn Sie Ihr Array geordnet halten möchten, müssen Sie alle Elemente rechts vom Löschindex um eins nach links verschieben. Hoffentlich kann dies in Golang leicht gemacht werden:
Dies ist jedoch ineffizient, da Sie möglicherweise alle Elemente verschieben müssen, was teuer ist.
Ordnung ist nicht wichtig
Wenn Sie sich nicht für die Bestellung interessieren, haben Sie die viel schnellere Möglichkeit, das zu löschende Element gegen das am Ende des Slice zu tauschen und dann die ersten n-1 Elemente zurückzugeben:
Bei der Reslicing-Methode dauert das Entleeren eines Arrays von 1 000 000 Elementen 224 s, bei diesem dauert es nur 0,06 ns. Ich vermute, dass intern go nur die Länge des Slice ändert, ohne es zu ändern.
Bearbeiten 1
Schnelle Notizen basierend auf den Kommentaren unten (danke!).
Da der Zweck darin besteht, ein Element zu löschen, wird der zweite verschwendet, wenn die Reihenfolge keine Rolle spielt und ein einzelner Austausch erforderlich ist:
Diese Antwort führt auch keine Grenzüberprüfung durch . Es erwartet einen gültigen Index als Eingabe. Dies bedeutet, dass negative Werte oder Indizes, die größer oder gleich len sind, zu Panik führen. Slices und Arrays sind 0-indiziert. Wenn Sie das n-te Element eines Arrays entfernen, müssen Sie die Eingabe n-1 bereitstellen . Um das erste Element zu entfernen, rufen Sie remove (s, 0) auf , um das zweite zu entfernen, rufen Sie remove (s, 1) auf und so weiter und so fort.
quelle
s[i] = s[len(s)-1]; return s[:len(s)-1]
wäre genug.return s[1:]
dem auch die ursprüngliche Frage nicht beantwortet wird.s[i] = s[len(s)-1]
Kopiert definitiv das letzte Element in das Element am Indexi
. Dannreturn s[:len(s)-1]
kehrt die Scheibe ohne das letzte Element. Zwei Aussagen dort.Entfernen Sie ein Element aus dem Slice (dies wird als "erneutes Schneiden" bezeichnet):
quelle
2019/09/28 19:46:25 http: panic serving 192.168.1.3:52817: runtime error: slice bounds out of range [7:5] goroutine 7 [running]:
panic
dass der Index das letzte Element im SliceKleiner Punkt (Code Golf), aber wenn die Reihenfolge keine Rolle spielt, müssen Sie die Werte nicht tauschen. Überschreiben Sie einfach die zu entfernende Array-Position mit einem Duplikat der letzten Position und geben Sie dann ein abgeschnittenes Array zurück.
Gleiches Ergebnis.
quelle
s[i] = s[0]
und dann ein Array mit nur den letzten n-1 Elementen zurückzugeben.return s[1:]
s[1:]
versuss[:len(s)-1]
ist, dass das spätere viel besser funktioniert, wenn das Slice später bearbeitet wirdappend
oder Löschungen mitappend
s vermischt werden . Letzteres behält die Slice-Kapazität bei, wohingegen Ersteres dies nicht tut.Das ist etwas seltsam zu sehen, aber die meisten Antworten hier sind gefährlich und beschönigen, was sie tatsächlich tun. Wenn Sie sich die ursprüngliche Frage ansehen, die zum Entfernen eines Elements aus dem Slice gestellt wurde, wird eine Kopie des Slice erstellt und dann gefüllt. Dies stellt sicher, dass beim Übergeben der Slices um Ihr Programm keine subtilen Fehler auftreten.
Hier ist ein Code, der die Antworten der Benutzer in diesem Thread mit dem ursprünglichen Beitrag vergleicht. Hier ist ein Spielplatz , auf dem Sie mit diesem Code herumspielen können.
Anhängebasierte Entfernung
Im obigen Beispiel können Sie sehen, wie ich ein Slice erstelle und es manuell mit den Nummern 0 bis 9 fülle. Wir entfernen dann Index 5 von allen und weisen ihn zu, um Index zu entfernen. Wenn wir jedoch jetzt alles ausdrucken, sehen wir, dass es ebenfalls geändert wurde. Dies liegt daran, dass Slices Zeiger auf ein zugrunde liegendes Array sind. Das Ausschreiben auf
removeIndex
Ursachenall
, die ebenfalls geändert werden sollen, mit dem Unterschied, dassall
es um ein Element länger ist, von dem aus es nicht mehr erreichbar istremoveIndex
. Als nächstes ändern wir einen Wert inremoveIndex
und wir können sehen, dass er ebenfallsall
geändert wird. Effective go geht hier näher darauf ein.Das folgende Beispiel werde ich nicht näher erläutern, aber es macht dasselbe für unsere Zwecke. Und zeigt nur, dass die Verwendung von Kopien nicht anders ist.
Die Fragen Originalantwort
Bei Betrachtung der ursprünglichen Frage wird das Slice, aus dem ein Element entfernt wird, nicht geändert. Die ursprüngliche Antwort in diesem Thread ist für die meisten Leute, die auf diese Seite kommen, die bisher beste.
Wie Sie sehen können, verhält sich diese Ausgabe so, wie es die meisten Leute erwarten würden und wahrscheinlich, was die meisten Leute wollen. Das Ändern von
originalRemove
verursacht keine Änderungen inall
und das Entfernen und Zuweisen des Index verursacht auch keine Änderungen! Fantastisch!Dieser Code ist jedoch etwas langwierig, sodass der obige Code geändert werden kann.
Eine richtige Antwort
Fast identisch mit der ursprünglichen Lösung zum Entfernen von Indizes. Wir erstellen jedoch ein neues Slice, an das angehängt werden muss, bevor Sie zurückkehren.
quelle
all
auch danach geändert,removeIndex := RemoveIndex(all, 5)
da das Anhängen dasselbe zugrunde liegende Array wiederverwendet, wenn es über genügend Kapazität verfügt (das Entfernen eines Elements erfordert natürlich nicht mehr Kapazität). Wenn wir dagegen Elemente hinzufügen und zuweisen,removeIndex
weist append ein neues Array zu undall
ändert sich nicht.Dies ist , wie Sie löschen Von einer Scheibe der golang Art und Weise . Sie müssen keine Funktion erstellen, die in den Anhang integriert ist. Probieren Sie es hier aus https://play.golang.org/p/QMXn9-6gU5P
quelle
Aus dem Buch The Go Programming Language
quelle
Ich gehe wie folgt vor, um das Element in Slice zu entfernen. Dies hilft bei der Lesbarkeit für andere. Und auch unveränderlich.
quelle
Vielleicht können Sie diese Methode ausprobieren:
Verwendung:
Ergebnis:
quelle
Vielleicht hilft dieser Code.
Es löscht ein Element mit einem bestimmten Index.
Nimmt das Array und den Index zum Löschen und gibt ein neues Array zurück, ähnlich der Append-Funktion.
Hier können Sie mit dem Code spielen: https://play.golang.org/p/aX1Qj40uTVs
quelle
Der beste Weg, dies zu tun, ist die Verwendung der Append-Funktion:
https://play.golang.org/p/-EEFCsqse4u
quelle
Sie müssen nicht jedes einzelne Element überprüfen, es sei denn, Sie kümmern sich um den Inhalt und können Slice Append verwenden. Versuch es
quelle
Hier ist das Spielplatzbeispiel mit Zeigern. https://play.golang.org/p/uNpTKeCt0sH
quelle