C'est un peu étrange à voir, mais la plupart des réponses ici sont dangereuses et ignorent ce qu'elles font réellement. En regardant la question d'origine qui a été posée sur la suppression d'un élément de la tranche, une copie de la tranche est en cours de création, puis remplie. Cela garantit que lorsque les tranches sont transmises à votre programme, vous n'introduisez pas de bogues subtils.
Voici un code comparant les réponses des utilisateurs dans ce fil de discussion et dans l'article original. Voici un terrain de jeu pour jouer avec ce code.
Ajouter la suppression basée
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)
}
Dans l'exemple ci-dessus, vous pouvez me voir créer une tranche et la remplir manuellement avec les nombres 0 à 9. Nous supprimons ensuite l'index 5 de tous et l'assignons pour supprimer l'index. Cependant, lorsque nous allons tout imprimer maintenant, nous voyons qu'il a également été modifié. En effet, les tranches sont des pointeurs vers un tableau sous-jacent. L'écrire dans les removeIndex
causes all
à modifier également avec la différence étant all
est plus long par un élément qui n'est plus accessible à partir de removeIndex
. Ensuite, nous changeons une valeur dans removeIndex
et nous pouvons voir qu'elle all
est également modifiée. Efficace va plus en détail à ce sujet.
Je n'entrerai pas dans l'exemple suivant, mais il fait la même chose pour nos besoins. Et illustre simplement que l'utilisation de la copie n'est pas différente.
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)
}
Les questions réponse originale
En regardant la question d'origine, cela ne modifie pas la tranche dont il supprime un élément. Faire de la réponse originale dans ce fil la meilleure à ce jour pour la plupart des gens qui viennent sur cette page.
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)
}
Comme vous pouvez le voir, cette sortie agit comme la plupart des gens s'y attendraient et probablement ce que la plupart des gens veulent. La modification de originalRemove
n'entraîne pas de changements dans all
et l'opération de suppression de l'index et de son attribution n'entraîne pas non plus de changements! Fantastique!
Ce code est un peu long, donc ce qui précède peut être changé en cela.
Une bonne réponse
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)
}
Presque identique à la solution originale de suppression d'index, mais nous créons une nouvelle tranche à ajouter avant de revenir.