範囲ループでは文字列とルーン スライスは同等ですか?
従来の常識では、範囲ループを使用して文字列とそれに対応するルーン スライスを反復処理すると、同じ結果が得られます。ただし、この仮定は完全に正確であるわけではありません。
範囲ループの違い
範囲構文を使用して文字列を反復処理する場合:
<code class="go">for _, s := range str</code>
対照的に、ルーン スライスの反復 (例: []rune(str)):
<code class="go">for _, s := range []rune(str)</code>
影響
この違いは、マルチバイト文字を扱うときに明らかになります。文字列の場合、インデックス i は、UTF-8 文字の可変長エンコーディングを考慮して複数のバイトをスキップする場合があります。この動作は、インデックス作成を通じて文字列コンテンツを変更するときに予期しない動作を引き起こす可能性があります。
優先オプションとしてのルーン スライス
これらのインデックス作成の落とし穴を回避し、正確な文字操作を保証するには、通常、このような操作には文字列の代わりにルーン スライスを使用することをお勧めします。ルーン スライスは文字への直接アクセスを提供し、マルチバイト エンコーディングから生じる潜在的な複雑さを排除します。
範囲ループ例外
ただし、範囲ループは例外を提供することに注意してください。この規則の例外です。範囲構文を使用して文字列を反復処理する場合、インデックス i はバイト位置を表しますが、範囲変数 s には UTF-8 ルーンが保持されます。これにより、単一ループ内で文字列レベルと文字レベルの両方の操作が可能になります。この動作は文字列に対する範囲ループに特有であり、文字カウントや Unicode 処理などのタスクによく利用されます。
以上が範囲ループ内の文字列とルーンのスライスは同一ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。