Je voulais ça :
for i := 0; i < len(str); i++ {
dosomethingwithrune(str[i]) // takes a rune
}
Mais il s'avère que str[i]
a un type byte
( uint8
) plutôt que rune
.
Comment puis-je itérer sur la chaîne par runes plutôt que par octets ?
Je voulais ça :
for i := 0; i < len(str); i++ {
dosomethingwithrune(str[i]) // takes a rune
}
Mais il s'avère que str[i]
a un type byte
( uint8
) plutôt que rune
.
Comment puis-je itérer sur la chaîne par runes plutôt que par octets ?
Voir cet exemple de Go efficace :
for pos, char := range "" {
fmt.Printf("character %c starts at byte position %d\n", char, pos)
}
Cette impression :
character starts at byte position 0
character starts at byte position 3
character starts at byte position 6
Pour les cordes, la gamme fait plus de travail pour vous, en brisant l'i points de code Unicode en analysant l'UTF-8.
Pour reprendre un exemple donné à golang.org Avec Go, vous pouvez facilement convertir une chaîne en une tranche de runes, puis itérer sur cette dernière, comme vous le souhaitiez à l'origine :
runes := []rune("Hello, ")
for i := 0; i < len(runes) ; i++ {
fmt.Printf("Rune %v is '%c'\n", i, runes[i])
}
Bien sûr, nous pourrions également utiliser un opérateur de plage comme dans les autres exemples ici, mais ceci suit de plus près votre syntaxe originale. Dans tous les cas, ceci produira un résultat :
Rune 0 is 'H'
Rune 1 is 'e'
Rune 2 is 'l'
Rune 3 is 'l'
Rune 4 is 'o'
Rune 5 is ','
Rune 6 is ' '
Rune 7 is ''
Rune 8 is ''
Notez que, puisque le rune
est un alias pour int32
nous devons utiliser %c
au lieu de l'habituel %v
dans le Printf
ou nous verrons la représentation entière du point de code Unicode (cf. Une visite de Go ).
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.