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
package main
import (
"fmt"
)
func RemoveIndex(s []int, index int) []int {
return append(s[:index], s[index+1:]...)
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all) //[0 1 2 3 4 5 6 7 8 9]
removeIndex := RemoveIndex(all, 5)
fmt.Println("all: ", all) //[0 1 2 3 4 6 7 8 9 9]
fmt.Println("removeIndex: ", removeIndex) //[0 1 2 3 4 6 7 8 9]
removeIndex[0] = 999
fmt.Println("all: ", all) //[999 1 2 3 4 6 7 9 9]
fmt.Println("removeIndex: ", removeIndex) //[999 1 2 3 4 6 7 8 9]
}
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
Ursachen all
, die ebenfalls geändert werden sollen, mit dem Unterschied, dass all
es um ein Element länger ist, von dem aus es nicht mehr erreichbar ist removeIndex
. Als nächstes ändern wir einen Wert in removeIndex
und wir können sehen, dass er ebenfalls all
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.
package main
import (
"fmt"
)
func RemoveCopy(slice []int, i int) []int {
copy(slice[i:], slice[i+1:])
return slice[:len(slice)-1]
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all) //[0 1 2 3 4 5 6 7 8 9]
removeCopy := RemoveCopy(all, 5)
fmt.Println("all: ", all) //[0 1 2 3 4 6 7 8 9 9]
fmt.Println("removeCopy: ", removeCopy) //[0 1 2 3 4 6 7 8 9]
removeCopy[0] = 999
fmt.Println("all: ", all) //[99 1 2 3 4 6 7 9 9]
fmt.Println("removeCopy: ", removeCopy) //[999 1 2 3 4 6 7 8 9]
}
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.
package main
import (
"fmt"
)
func OriginalRemoveIndex(arr []int, pos int) []int {
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++
} else {
k++
}
i++
}
return new_arr
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all) //[0 1 2 3 4 5 6 7 8 9]
originalRemove := OriginalRemoveIndex(all, 5)
fmt.Println("all: ", all) //[0 1 2 3 4 5 6 7 8 9]
fmt.Println("originalRemove: ", originalRemove) //[0 1 2 3 4 6 7 8 9]
originalRemove[0] = 999
fmt.Println("all: ", all) //[0 1 2 3 4 5 6 7 8 9]
fmt.Println("originalRemove: ", originalRemove) //[999 1 2 3 4 6 7 8 9]
}
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 in all
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
package main
import (
"fmt"
)
func RemoveIndex(s []int, index int) []int {
ret := make([]int, 0)
ret = append(ret, s[:index]...)
return append(ret, s[index+1:]...)
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all) //[0 1 2 3 4 5 6 7 8 9]
removeIndex := RemoveIndex(all, 5)
fmt.Println("all: ", all) //[0 1 2 3 4 5 6 7 8 9]
fmt.Println("removeIndex: ", removeIndex) //[0 1 2 3 4 6 7 8 9]
removeIndex[0] = 999
fmt.Println("all: ", all) //[0 1 2 3 4 5 6 7 9 9]
fmt.Println("removeIndex: ", removeIndex) //[999 1 2 3 4 6 7 8 9]
}
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.