Go でマルチバイト文字を扱うときに文字列の代わりにルーン スライスを使用する必要があるのはなぜですか?

Barbara Streisand
リリース: 2024-11-02 14:03:02
オリジナル
564 人が閲覧しました

Why Should You Use Rune Slices Instead of Strings When Working with Multibyte Characters in Go?

文字列の範囲指定とルーン スライスの違いを理解する

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>
ログイン後にコピー

ここで、文字列をルーン スライスに変換するバリエーションを調べてみましょう。はルーンであり、文字列は依然として同じ文字列表現を提供します。

微妙な違い

両方のシナリオの結果は一見同じように見えますが、決定的な違いがあります:

  • 文字列を範囲とする場合、インデックス (_) はバイト インデックスを表し、s は Unicode コードを格納しますpoint.
  • ルーン スライスを範囲指定する場合、インデックスは バイト インデックスも表しますが、 s は ルーン自体を格納します。

マルチバイト文字 (中国語や韓国語などの非ラテン文字) を扱う場合、UTF-8 表現は複数のバイトで構成されているため、この微妙な違いが明らかになります。

実際的な意味

マルチバイト文字を扱う場合、文字列の代わりにルーン スライスを使用する方が適切です。これは、ルーンは単一の論理文字を表すのに対し、文字列には同じ文字を表す複数のバイトが含まれる可能性があるためです。

潜在的な問題を回避するには、一般に、特に次のような場合には、文字列ではなくルーン スライスよりも範囲ループを優先することをお勧めします。非ラテン文字を扱います。

以上がGo でマルチバイト文字を扱うときに文字列の代わりにルーン スライスを使用する必要があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!