次のコードがあります。rune
をstring
にキャストして出力することになっています。ただし、印刷すると未定義の文字が表示されます。バグの場所を特定できません。
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))
}
これは、 Scanner.Scan()
を使用してrune
を読み取るためですが、他の処理を行うためです。 Scanner.Scan()
は、tokensまたは_Scanner.Mode
_ビットマスクによって制御される特別なトークンのrune
sの読み取りに使用でき、特別な定数を返します。 _text/scanner
_ パッケージであり、読み取りルーン自体ではありません。
単一のrune
を読み取るには、代わりに Scanner.Next()
を使用します。
_c := b.Next()
fmt.Println(c, string(c), strconv.QuoteRune(c))
_
出力:
_97 a 'a'
_
単一のrune
をstring
に変換するだけの場合は、単純なタイプ 変換 を使用します。 rune
は_int32
_のエイリアスであり、整数をstring
に変換します。
符号付きまたは符号なし整数値を文字列型に変換すると、整数のUTF-8表現を含む文字列が生成されます。
そう:
_r := rune('a')
fmt.Println(r, string(r))
_
出力:
_97 a
_
また、string
値のルーンをループするには、単に_for ... range
_コンストラクトを使用できます。
_for i, r := range "abc" {
fmt.Printf("%d - %c (%v)\n", i, r, r)
}
_
出力:
_0 - a (97)
1 - b (98)
2 - c (99)
_
または、単にstring
値を_[]rune
_に変換できます。
_fmt.Println([]rune("abc")) // Output: [97 98 99]
_
utf8.DecodeRuneInString()
もあります。
Go Playground の例を試してください。
注:
元のコード(Scanner.Scan()
を使用)は次のように機能します。
Scanner.Init()
を呼び出して、モード(_b.Mode
_)を_scanner.GoTokens
_に設定します。("a"
_からの)入力でScanner.Scan()
を呼び出すと、_scanner.Ident
_が有効なGo識別子であるため、_"a"
_が返されます。
_c := b.Scan()
if c == scanner.Ident {
fmt.Println("Identifier:", b.TokenText())
}
// Output: "Identifier: a"
_
私はパーティーに少し遅れていることを知っていますが、ここに文字列関数の[]ルーンがあります:
func runesToString(runes []rune) (outString string) {
// don't need index so _
for _, v := range runes {
outString += string(v)
}
return
}
はい、名前付きの戻り値がありますが、行数を減らし、関数が短いだけなので、この場合は大丈夫だと思います