Supprimer un élément dans une tranche
func main() {
a := []string{"Hello1", "Hello2", "Hello3"}
fmt.Println(a)
//[Hello1 Hello2 Hello3]
a = append(a[:0], a[1:]...)
fmt.Println(a)
//[Hello2 Hello3]
}
Comment supprimer cette astuce, avec l'ajout de la fonction de travail?
Il semblerait qu'il accapare tout avant que le premier élément (tableau vide)
En ajoutant tout ce qui est après le premier élément (position zéro)
Ce qui ne l' ... (dot dot dot) faire?
- Vérifier code.google.com/p/go-wiki/wiki/SliceTricks
- Pourquoi ne pas prendre un coup d'oeil à la langue spec?
...
est expliqué là, dans le détail? - D'une part, absolument vrai (golang.org/ref/spec, tout le monde); de l'autre, il y a assez peu familier au sujet de ces idiomes pour la migration Pythoneux, etc. que je ne me dérange pas d'avoir une explication pour les autres à trouver.
- Voir github.com/golang/go/wiki/SliceTricks
Vous devez vous connecter pour publier un commentaire.
Où
a
est la tranche, eti
est l'indice de l'élément que vous souhaitez supprimer:...
est la syntaxe pour les variadic arguments en Aller.En gros, quand définition une fonction, il met tous les arguments que vous passer dans une tranche de ce type. En faisant cela, vous pouvez passer autant d'arguments que vous le souhaitez (par exemple,
fmt.Println
peut prendre autant d'arguments que vous voulez).Maintenant, quand appel une fonction,
...
fait le contraire: il déballe une tranche et les transmet comme séparer les arguments d'une variadic fonction.De sorte que cette ligne n':
est essentiellement:
Maintenant, vous demandez peut-être, pourquoi ne pas
Bien, la définition de la fonction de
append
estDonc le premier argument doit être une tranche du type correct, le second argument est le variadic, de sorte que nous passons dans un vide tranche, et puis de décompresser le reste de la tranche de remplir les arguments.
a = append(a[:i], a[i+1:]...)
append(a[:i], a[i+1:]...)
. Si un élément de l'enfant,append(a[i][:j], a[i][j+1:]...)
Il y a deux options:
Un: vous Vous souciez de soutènement de la matrice de commande:
B: Vous n'avez pas de soins de maintien de l'ordre (ce qui est probablement le plus rapide):
Voir le lien pour voir les implications re fuites de mémoire si votre tableau est de pointeurs.
https://github.com/golang/go/wiki/SliceTricks
Plutôt que de penser que des indices dans le
[a:]
-,[:b]
- et[a:b]
notations comme indice de l'élément, pensez à eux comme les indices des lacunes autour et entre les éléments, à commencer par l'écart indexé0
avant de l'élément indexé comme0
.Regardant seulement le bleu, il est beaucoup plus facile de voir ce qui se passe:
[0:3]
enferme tout,[3:3]
est vide et[1:2]
donnerait{"B"}
. Puis[a:]
est juste la version courte de[a:len(arrayOrSlice)]
,[:b]
la version courte de[0:b]
et[:]
la version courte de[0:len(arrayOrSlice)]
. Ce dernier est couramment utilisé pour transformer un tableau en une tranche en cas de besoin.... est la syntaxe pour les variadic arguments.
Je pense qu'il est mis en œuvre par le compilateur à l'aide de la tranche de
[]Type)
, tout comme la fonction append :lorsque vous utilisez "elems" dans "ajouter", en fait, c'est une tranche([]type).
Donc "
a = append(a[:0], a[1:]...)
" signifie "a = append(a[0:0], a[1:])
"a[0:0]
est une tranche qui n'a riena[1:]
est "Hello2 Hello3"C'est la façon dont il fonctionne
a[0:0]
n'est pasnil
mais une tranche de longueur 0.a[0:0]
sera uniquement êtrenil
sia
estnil
.Dans golang wiki il montrer quelques trucs pour la tranche, y compris de supprimer un élément de la tranche.
Lien: entrez description du lien ici
Par exemple un est le morceau dont vous voulez supprimer le numéro, j'ai élément.
OU
Ou depuis que vous essayez de trouver l'indice de l'élément qui doit être supprimé de toute façon,
Ok jamais l'esprit. Bonne réponse pour le sujet, mais mauvaise réponse à la question du corps.
Je suis à l'obtention d'un indice en dehors de la plage d'erreur avec la accepté de répondre à la solution.
Raison:
Lorsque le début de la plage, il n'est pas itération de la valeur, un par un, il est itérer par l'index.
Si vous avez modifié une tranche alors qu'il est à portée, il va induire un problème.
Vieille Réponse:
Prévu :
Réel:
Façon Correcte (Solution):
Source: https://dinolai.com/notes/golang/golang-delete-slice-item-in-range-problem.html