Das Durchlaufen von Slices in Go erfordert oft die Neuanordnung ihrer Elemente. Der Versuch, ein Element direkt von einer Position an eine andere zu verschieben, kann zu unerwarteten Ergebnissen führen, wie im bereitgestellten Code-Snippet gezeigt:
slice := []int{0,1,2,3,4,5,6,7,8,9}
indexToRemove := 1
indexWhereToInsert := 4
slice = append(slice[:indexToRemove], slice[indexToRemove 1:]...)
newSlice := append(slice[:indexWhereToInsert], 1)
slice = append(newSlice, slice[indexWhereToInsert:]...)
Dieser Ansatz zielt darauf ab, das Element bei indexToRemove nach indexWhereToInsert zu verschieben, aber die Ausgabe zeigt zwei Kopien des verschobenen Elements. Der Fehler liegt in der Art und Weise, wie das Element entfernt und eingefügt wird. Lassen Sie uns einen alternativen Ansatz erkunden:
Verwendung benutzerdefinierter Funktionen zur Elementmanipulation
Anstatt den Slice manuell zu ändern, können wir spezielle Funktionen zum Einfügen und Entfernen erstellen:
func insertInt(array []int, value int, index int) []int {
return append(array[:index], append([]int{value}, array[index:]...)...)
}
func removeInt(array []int, index int) []int {
return append(array[:index], array[index 1:]...)
}
Elemente präzise verschieben
Mit diesen Hilfsfunktionen ist das Verschieben eines Elements unkompliziert:
func moveInt(array []int, srcIndex int, dstIndex int) []int {
value := array[srcIndex]
return insertInt(removeInt(array, srcIndex), value, dstIndex)
}
Beispielimplementierung und -ausgabe
func main() {
slice := []int{0,1,2,3,4,5,6,7,8,9}
fmt.Println("Original slice:", slice)
slice = insertInt(slice, 2, 5)
fmt.Println("After insertion:", slice)
slice = removeInt(slice, 5)
fmt.Println("After removal:", slice)
slice = moveInt(slice, 1, 4)
fmt.Println("After moving:", slice)
}
Ausgabe:
Original slice: [0 1 2 3 4 5 6 7 8 9] After insertion: [0 1 2 3 4 2 5 6 7 8 9] After removal: [0 1 2 3 4 5 6 7 8 9] After moving: [0 2 1 3 4 5 6 7 8 9]
Dieser Ansatz verschiebt das Element von Index 1 korrekt auf Index 4, was zur erwarteten Ausgabe führt.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3