Comprendre le comportement de l'expression Slice de Go
Dans Go, le découpage est un mécanisme puissant permettant d'extraire des éléments spécifiques d'une tranche, d'un tableau ou d'une chaîne. Cependant, certains comportements peuvent paraître inattendus, comme les suivants :
a := []int{1, 2, 3} fmt.Println(a[0:]) fmt.Println(a[1:]) fmt.Println(a[2:]) fmt.Println(a[3:]) // doesn't panic - why?? fmt.Println(a[4:]) // panics as expected
Pourquoi un[3:] ne panique-t-il pas ?
Selon le langage Go spécification, pour les tranches de tableau ou de chaîne, les indices sont dans la plage s'ils satisfont à la condition suivante : 0 <= low <= high <= len(a). Cependant, pour les tranches, la limite supérieure de l'index est cap(a) plutôt que len(a). Dans ce cas, le tableau sous-jacent a une capacité de 3, qui est égale à sa longueur.
Par conséquent, a[3:] ne panique pas car la limite supérieure de l'index de 3 est dans la plage valide déterminée par cap(a). Il en résulte une tranche vide, car elle commence à l'index 3 et a une longueur de 0 (len(a) - 3 = 0).
Pourquoi a[4:] panique-t-il ?
D'un autre côté, a[4:] panique car la limite supérieure de l'index de 4 dépasse à la fois len(a) et cap(a). La spécification indique que les indices hors plage au moment de l'exécution entraîneront une panique à l'exécution.
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!