Golang la conversion de la rune de la chaîne
J'ai le code suivant, il est censé jeter un rune
dans un string
et de l'imprimer. Cependant, j'obtiens des caractères non définis lors de l'impression. Je n'arrive pas à trouver où est le bug est:
package main
import (
"fmt"
"strconv"
"strings"
"text/scanner"
)
func main() {
var b scanner.Scanner
const a = `a`
b.Init(strings.NewReader(a))
c := b.Scan()
fmt.Println(strconv.QuoteRune(c))
}
Une raison de vous forcer à utiliser le scanner? Je veux dire que vous essayer de comprendre comment "text/scanner" ou que vous simplement voulez convertir rune à la chaîne?
OriginalL'auteur user3551708 | 2016-08-31
Vous devez vous connecter pour publier un commentaire.
C'est parce que vous avez utilisé
Scanner.Scan()
de lire unrune
mais il fait quelque chose d'autre.Scanner.Scan()
peut être utilisé pour lire jetons ourune
s de des jetons spéciaux contrôlés par leScanner.Mode
masque de bits, et il retourne spécial des constantes de la forme de latext/scanner
, ce n'est pas la lecture de la rune elle-même.De lire un seul
rune
utilisationScanner.Next()
à la place:De sortie:
Si vous voulez convertir un seul
rune
àstring
, l'utilisation d'un type simple conversion.rune
est un alias pourint32
, et de la conversion d'un nombre entier destring
:Donc:
Sorties:
Aussi faire une boucle sur les runes d'un
string
valeur, vous pouvez simplement utiliser lafor ... range
construire:De sortie:
Ou vous pouvez simplement convertir un
string
de la valeur à[]rune
:Il est également
utf8.DecodeRuneInString()
.Essayer les exemples sur la Aller De L'Aire De Jeux.
Remarque:
Votre code d'origine (à l'aide de
Scanner.Scan()
) fonctionne comme ceci:Scanner.Init()
qui définit le Mode (b.Mode
) àscanner.GoTokens
.Appel
Scanner.Scan()
sur l'entrée (à partir de"a"
) renvoiescanner.Ident
parce que"a"
est valide Aller de l'identificateur:OriginalL'auteur icza
Je sais que je suis un peu en retard à la fête, mais voici un []rune pour fonction de chaîne:
oui, il est nommé en retour, mais je pense que c'est ok, dans ce cas, car elle réduit le nombre de lignes et la fonction est seulement à court
[]rune
àstring
de conversion est pris en charge nativement par le spec, c'est complètement inutile et lent. Au lieu d'utiliser un simple conversion:outString := string(runes)
Merci @icza 🙂
OriginalL'auteur MarkJL