Go では、文字列の範囲指定とルーン スライスを使用した反復処理は、一見すると同じように見えるかもしれません。どちらも Unicode を生成するからです。それぞれのデータ構造のコードポイント。ただし、マルチバイト文字を扱う場合に明らかになる決定的な違いがあります。
次のコードのように、文字列を直接範囲指定する場合:
<code class="go">for _, s := range str { fmt.Printf("type of v: %s, value: %v, string v: %s \n", reflect.TypeOf(s), s, string(s)) }</code>
実際には、一連のバイトを反復処理しています。 Go 文字列は本質的にバイト配列であるため、各反復で文字列から 1 バイトが生成されます。この粒度は、主に ASCII 文字を含む文字列には問題を引き起こさない可能性があります。ただし、マルチバイト文字を含む Unicode 文字列の場合、バイト単位の反復により予期しない結果が生じる可能性があります。
対照的に、ルーン スライスにわたる範囲は、文字列を明示的に変換することによって作成されます。
<code class="go">for _, s := range []rune(str) { fmt.Printf("type : %s, value: %v ,string : %s\n", reflect.TypeOf(s), s, string(s)) }</code>
のようなルーンのスライスに変換すると、コード ポイントの反復が可能になります。文字列とは異なり、ルーン スライスは Unicode 文字のシーケンスであるため、文字レベルでテキスト データを操作するのにより適しています。
文字列の範囲を指定するか、ルーン スライスを選択するかが決まります。インデックス作成を使用する場合はさらに重要です。文字列のインデックスを作成すると、文字のバイト位置が得られます。一方、ルーン スライスのインデックスを作成すると、コード ポイントのシーケンス内の文字のインデックスが得られます。
たとえば、マルチバイト文字を含む文字列があるとします。インデックス 1 でルーン スライスとしてインデックスを作成すると、その文字のインデックスが提供されますが、これはバイト インデックスとは異なる場合があります。
Go では、文字列とルーン スライスの範囲を指定します。さまざまな目的。文字列を範囲指定するとバイトが得られ、ルーン スライスを範囲指定すると文字レベルの反復が得られます。この 2 つのどちらを選択するかは、バイトと文字のどちらを扱う必要があるのか、またインデックス作成が要素であるかどうかによって決まります。汎用のテキスト操作には、文字エンコーディングに関係なく一貫した文字ベースの操作を保証するルーン スライスが推奨されます。
以上がGo における文字列の範囲指定とルーン スライスの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。