Maison >développement back-end >Golang >Pourquoi `a[len(slice)]` ne panique-t-il pas dans Go Slices ?
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
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 :
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!