Maison >développement back-end >Golang >Pourquoi \'panique : erreur d'exécution : index hors plage\' se produit-il lorsqu'une tranche Go a une longueur non nulle ?

Pourquoi \'panique : erreur d'exécution : index hors plage\' se produit-il lorsqu'une tranche Go a une longueur non nulle ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-31 15:24:52566parcourir

Why Does

Panique : erreur d'exécution : index hors plage lorsque la longueur du tableau n'est pas nulle

L'extrait de code fourni tente de parcourir une chaîne pour mots séparés contenant des voyelles. Cependant, il rencontre une erreur « panique : erreur d'exécution : index hors de portée », bien que la longueur du tableau ne soit pas nulle.

Pour comprendre cette erreur, il est essentiel de se plonger dans la structure de données de tranche sous-jacente.

Comprendre les tranches

Une tranche dans Go est un descripteur d'un segment de tableau. Il comprend trois composants : un pointeur vers le tableau réel, la longueur du segment et sa capacité (la longueur maximale que le segment peut accueillir).

Lors de la création d'une tranche à l'aide de make([]string, 0, 4) , un tableau sous-jacent vide est alloué, avec une longueur initiale de 0 et une capacité de 4.

Faire un Distinction

result := make([]string, 0, 4) diffère de result := make([]string, 4) de la manière suivante :

  • make([]string, 0, 4) : initialise un tableau vide, ce qui signifie que l'accès à result[0] provoquera un panique.
  • make([]string, 4) : initialise un tableau avec 4 éléments, permettant l'accès au résultat[0] via le résultat[3].

Compréhension append

La fonction append ajoute des éléments à la fin d'une tranche. Si la tranche a suffisamment de capacité, elle retranche la destination pour accueillir les nouveaux éléments. Sinon, un nouveau tableau sous-jacent est alloué.

Application au code

Dans le code fourni, la ligne result := make([]string, 0, 4 ) crée une tranche vide. Tenter d'accéder au résultat[0] dans la boucle entraînera une panique.

Pour corriger ce problème, utilisez append pour remplir la tranche, comme dans l'extrait de code suivant :

<code class="go">for i := 0; i < len(strs); i++ {
    if strings.ContainsAny(strs[i], "eaiu") {
        result = append(result, strs[i])
    }
}</code>

Alternativement, vous pouvez simplifier le code à l'aide d'une boucle basée sur une plage :

<code class="go">for _, s := range strs {
    if strings.ContainsAny(s, "eaiu") {
        result = append(result, s)
    }
}</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn