90 votes

Comment itérer sur une chaîne de caractères par runes en Go ?

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 ?

143voto

dystroy Points 145126

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.

25voto

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 ).

19voto

zzzz Points 23017

Par exemple :

package main

import "fmt"

func main() {
        for i, rune := range "Hello, " {
                fmt.Printf("%d: %c\n", i, rune)
        }
}

Terrain de jeux


Sortie :

0: H
1: e
2: l
3: l
4: o
5: ,
6:  
7: 
10:

Prograide.com

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.

Powered by:

X