文字列の範囲指定とルーン スライスの違いを理解する
Go で文字列を操作する場合、一般的な 2 つのシナリオに遭遇することがあります。文字列とルーン スライスにわたる範囲。どちらのアプローチも文字の取得では似ているように見えますが、プログラムの動作に影響を与える可能性のある微妙な違いがあります。
文字列の範囲指定
次のコードを考えてみましょう。
<code class="go">func main() { str := "123456" for _, s := range str { fmt.Printf("type of v: %s, value: %v, string v: %s \n", reflect.TypeOf(s), s, string(s)) } }</code>
このコードは文字列内の各文字を反復処理しますが、s のデータ型は int32 であり、文字列はルーンを文字列としてエンコードするために使用されることに注意してください。
ルーン スライスにわたる範囲
ここで、[]rune(str):
<code class="go">func main() { str := "123456" for _, s := range []rune(str) { fmt.Printf("type : %s, value: %v ,string : %s\n", reflect.TypeOf(s), s, string(s)) } }</code>
ここで、文字列をルーン スライスに変換するバリエーションを調べてみましょう。はルーンであり、文字列は依然として同じ文字列表現を提供します。
微妙な違い
両方のシナリオの結果は一見同じように見えますが、決定的な違いがあります:
マルチバイト文字 (中国語や韓国語などの非ラテン文字) を扱う場合、UTF-8 表現は複数のバイトで構成されているため、この微妙な違いが明らかになります。
実際的な意味
マルチバイト文字を扱う場合、文字列の代わりにルーン スライスを使用する方が適切です。これは、ルーンは単一の論理文字を表すのに対し、文字列には同じ文字を表す複数のバイトが含まれる可能性があるためです。
潜在的な問題を回避するには、一般に、特に次のような場合には、文字列ではなくルーン スライスよりも範囲ループを優先することをお勧めします。非ラテン文字を扱います。
以上がGo でマルチバイト文字を扱うときに文字列の代わりにルーン スライスを使用する必要があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。