Maison > développement back-end > Golang > Pourquoi Go génère-t-il une erreur d'exécution lorsque la longueur d'une tranche dépasse sa capacité ?

Pourquoi Go génère-t-il une erreur d'exécution lorsque la longueur d'une tranche dépasse sa capacité ?

Barbara Streisand
Libérer: 2024-10-29 17:26:02
original
370 Les gens l'ont consulté

 Why Does Go Throw a Runtime Error When a Slice's Length Exceeds its Capacity?

Comprendre les tranches : capacité par rapport à la longueur

Lorsque vous traitez des tranches dans Go, il est crucial de comprendre la relation entre la capacité et la longueur. La capacité fait référence à la taille du tableau sous-jacent sur lequel la tranche fonctionne, tandis que la longueur spécifie le nombre d'éléments actuellement inclus dans la tranche.

Erreur d'exécution : la longueur de la tranche dépasse la capacité

L'erreur « erreur d'exécution : makeslice : cap hors de portée » se produit lors de la tentative de création d'une tranche avec une capacité inférieure à sa longueur. Cette erreur se produit car les tranches, de par leur conception, maintiennent un invariant où la longueur ne peut jamais dépasser la capacité :

0 ≤ len(s) ≤ cap(s)
Copier après la connexion

Dans votre exemple de code :

type b []int
var k = make([]b, 10, 5)
fmt.Println(k[8])
Copier après la connexion

Vous avez défini une tranche k de type []b, où b est un autre type de tranche. Cependant, vous avez tenté de créer cette tranche avec une capacité de 5, ce qui est insuffisant pour s'adapter à sa longueur de 10. D'où l'erreur d'exécutionが発生します。

Pourquoi pas une compilation Erreur ?

Dans certains cas, comme le vôtre où les valeurs de capacité et de longueur sont statiques, un compilateur pourrait potentiellement détecter l'erreur au moment de la compilation. Cependant, cela n’est pas toujours réalisable. Considérez le code suivant :

package main

import (
    "fmt"
    "rand"
)

func main() {
    k := make([]int, rand.Int(), rand.Int())
    fmt.Println(k)
}
Copier après la connexion

Ici, les valeurs de capacité et de longueur sont déterminées dynamiquement au moment de l'exécution à l'aide du package rand. En tant que tels, les compilateurs ne sont pas en mesure de vérifier statiquement que la capacité dépassera toujours la longueur et doivent donc déléguer cette vérification au runtime.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal