3

ここに私のコードスニペットがあります:

var converter = map[rune]rune {//some data}

sample := "⌘こんにちは"

var tmp string

for _, runeValue := range sample {
        fmt.Printf("%+q", runeValue)
        tmp = fmt.Sprintf("%+q", runeValue)
    }

の出力fmt.Printf("%+q", runeValue)は次のとおりです。

'\u2318'
'\u3053'
'\u3093'
'\u306b'
'\u3061'
'\u306f'

これらの値は文字通りルーンですが、戻り値の型Sprintfが文字列であるため、マップで使用できません[rune]rune。文字列をルーン文字に変換するにはどうすればよいか、つまり、この問題をどのように処理できるかを考えていました。

4

1 に答える 1

6

Astringは単一runeの ではなく、複数の を含む場合がありますrunes。単純な型変換を使用しstringて、を の[]runesようなすべてのルーン文字を含むに変換できます[]rune(sample)

は aのfor rangeルーンを反復処理するstringため、例runeValueでは typeであり、マップでrune使用できます。たとえば、次のようになります。converter

var converter = map[rune]rune{}
sample := "⌘こんにちは"
for _, runeValue := range sample {
    converter[runeValue] = runeValue
}
fmt.Println(converter)

しかし、runeは のエイリアスであるためint32、上記のconverterマップを出力すると整数が出力され、出力は次のようになります。

map[8984:8984 12371:12371 12385:12385 12395:12395 12399:12399 12435:12435]

文字を印刷したい場合は、次の%c動詞を使用しfmt.Printf()ます。

fmt.Printf("%c\n", converter)

どちらが出力されますか:

map[⌘:⌘ こ:こ ち:ち に:に は:は ん:ん]

Go Playgroundで例を試してください。

内の特定のルーン文字を置き換える (切り替える) 場合は、次のように関数をstring使用します。strings.Map()

sample := "⌘こんにちは"

result := strings.Map(func(r rune) rune {
    if r == '⌘' {
        return 'a'
    }
    if r == 'こ' {
        return 'b'
    }
    return r
}, sample)

fmt.Println(result)

どの出力(Go Playgroundで試してください):

abんにちは

converterマップで定義された置換が必要な場合:

var converter = map[rune]rune{
    '⌘': 'a',
    'こ': 'b',
}
sample := "⌘こんにちは"

result := strings.Map(func(r rune) rune {
    if c, ok := converter[r]; ok {
        return c
    }
    return r
}, sample)

fmt.Println(result)

これは同じものを出力します。Go Playgroundでこれを試してみてください。

于 2020-12-08T09:21:06.663 に答える