Questo è un po 'strano da vedere, ma la maggior parte delle risposte qui sono pericolose e ignorano ciò che stanno effettivamente facendo. Guardando la domanda originale che è stata posta sulla rimozione di un elemento dalla sezione, viene creata una copia della sezione e quindi viene riempita. Ciò garantisce che mentre le sezioni vengono passate nel programma non si introducano piccoli bug.
Ecco del codice che confronta le risposte degli utenti in questo thread e nel post originale. Ecco un go playground per scherzare con questo codice.
Aggiungi rimozione basata
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)
removeIndex := RemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
removeIndex[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
}
Nell'esempio sopra puoi vedermi creare una sezione e riempirla manualmente con i numeri da 0 a 9. Quindi rimuoviamo l'indice 5 da tutto e lo assegniamo per rimuovere l'indice. Tuttavia quando andiamo a stampare tutto ora vediamo che è stato modificato anche lui. Questo perché le slice sono puntatori a un array sottostante. Scrivendolo anche per removeIndexcause allda modificare con la differenza che allè più lungo di un elemento da cui non è più raggiungibile removeIndex. Successivamente modifichiamo un valore in removeIndexe possiamo vedere che allviene modificato anche. Vai efficace entra in qualche dettaglio in più su questo.
Non entrerò nel seguente esempio, ma fa la stessa cosa per i nostri scopi. E dimostra solo che l'uso della copia non è diverso.
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)
removeCopy := RemoveCopy(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeCopy: ", removeCopy)
removeCopy[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeCopy: ", removeCopy)
}
La risposta originale alle domande
Guardando la domanda originale non modifica la sezione da cui rimuove un elemento. Rendere la risposta originale in questo thread la migliore finora per la maggior parte delle persone che visitano questa pagina.
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)
originalRemove := OriginalRemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("originalRemove: ", originalRemove)
originalRemove[0] = 999
fmt.Println("all: ", all)
fmt.Println("originalRemove: ", originalRemove)
}
Come puoi vedere, questo output agisce come la maggior parte delle persone si aspetterebbe e probabilmente ciò che la maggior parte delle persone desidera. La modifica di originalRemovenon causa cambiamenti alle anche l'operazione di rimozione dell'indice e assegnazione non causa cambiamenti! Fantastico!
Questo codice è un po 'lungo, quindi quanto sopra può essere modificato in questo.
Una risposta corretta
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)
removeIndex := RemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
removeIndex[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
}
Quasi identica alla soluzione di rimozione dell'indice originale, tuttavia creiamo una nuova fetta da aggiungere prima di tornare.