Maison > développement back-end > Golang > Pourquoi `a[len(slice)]` ne panique-t-il pas dans Go Slices ?

Pourquoi `a[len(slice)]` ne panique-t-il pas dans Go Slices ?

Susan Sarandon
Libérer: 2024-12-12 16:40:10
original
600 Les gens l'ont consulté

Why Doesn't `a[len(slice)]` Panic in Go Slices?

Le découpage perplexe de Go : pourquoi un[len(slice)] ne panique pas

Introduction

Dans Go, lors du découpage d'un tableau ou d'une tranche, on pourrait s'attendre à ce que le dépassement de la longueur du tableau ou de la tranche sous-jacente entraîne une panique. Cependant, pour les tranches, ce comportement diverge étrangement.

Le problème

Considérez le code Go suivant :

a := []int{1, 2, 3}
fmt.Println(a[0:])
fmt.Println(a[1:])
fmt.Println(a[2:])
fmt.Println(a[3:]) // Surprisingly, doesn't panic
fmt.Println(a[4:]) // Panics as expected
Copier après la connexion

déroutant que la tranche a [3:] ne produit pas de panique, même s'il semble dépasser la durée du array.

La réponse

Ce comportement est dicté par la spécification du langage Go :

  • Pour les tableaux et les chaînes, les indices hors plage sont définis comme faibles > len(a) ou élevé > len(a), où a est le tableau sous-jacent.
  • Pour les tranches, les indices hors plage sont définis comme élevés > cap(a), où cap(a) représente la capacité de la tranche.

Dans notre exemple, a est un tableau et sa longueur est 3. Cependant, en épissant jusqu'à la longueur du tableau, c'est-à-dire a[3:], est considéré dans la plage valide car le tableau sous-jacent a une longueur de 3.

Comme l'explique la spécification, "La limite supérieure de l'index est la capacité de la tranche cap(a) plutôt que la longueur." Donc, dans ce cas, a[3:] crée une tranche vide car haut - bas = 3 - 3 = 0.

Une distinction clé

Il est important de notez que l'utilisation d'un index au-delà de la capacité de la tranche (c'est-à-dire a[4:] dans notre exemple) reste hors de portée et entraînera une panique à l'exécution. La spécification indique explicitement ceci : "Si les indices sont hors de portée au moment de l'exécution, une panique à l'exécution se produit."

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal