Maison >développement back-end >Golang >Comment supprimer en toute sécurité des éléments d'un tableau de structures dans Go ?

Comment supprimer en toute sécurité des éléments d'un tableau de structures dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-29 22:43:09405parcourir

How to Safely Remove Elements from an Array of Structs in Go?

Suppression d'un élément de tableau de Struct dans Go

Lorsque vous travaillez avec des tableaux de structures dans Go, il peut être nécessaire de supprimer un élément basé sur une condition spécifique. Cependant, tenter de le faire dans une boucle peut entraîner des erreurs « hors de portée ».

Considérons l'exemple suivant :

type Config struct {
  Applications []Application
}

// config is initialized from a JSON file
config = new(Config)
_ = decoder.Decode(&config)

for i, application := range config.Applications {
  if i == 1 {
    config.Applications = _removeApplication(i, config.Applications)
  }
}

func _removeApplication(i int, list []Application) []Application {
  if i < len(list)-1 {
    list = append(list[:i], list[i+1:]...)
  } else {
    log.Print(list[i].Name)
    list = list[:i]
  }

  return list
}

Ce code tente de supprimer le deuxième élément (index 1 ) à partir de la gamme d'applications. Cependant, la suppression d'éléments dans cette boucle, surtout si l'élément actuel est supprimé, peut entraîner une indexation erronée en raison du décalage des positions des éléments après la suppression.

Solution recommandée

Pour éviter les problèmes d'indexation, il est conseillé de boucler dans l'ordre inverse :

for i := len(config.Applications) - 1; i >= 0; i-- {
    application := config.Applications[i]
    // Condition to decide if current element has to be deleted:
    if haveToDelete {
        config.Applications = append(config.Applications[:i],
                config.Applications[i+1:]...)
    }
}

Cette boucle descendante garantit que les éléments après celui étant supprimés sont décalés correctement, évitant ainsi tout problème hors plage.

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