違いの探索: Go における文字列の範囲とルーン スライス
Go で文字シーケンスを反復処理する場合、開発者は 2 つの類似したアプローチに遭遇する可能性があります。 : 文字列にわたる範囲とルーン スライスにわたる範囲。これらは同じ結果を生成するように見えますが、この 2 つには微妙な違いがあります。
文字列の範囲指定:
提供されたコード スニペットのように、文字列の範囲指定。文字列をバイトのシーケンスとして扱います。各反復では、s 変数で表される 1 バイトが生成されます。ただし、このアプローチには、複数のバイトにまたがる Unicode 文字などのマルチバイト文字を扱う場合に制限があります。
ルーン スライスの範囲:
別のアプローチは、次のように変換することです。 []rune(str) を使用して、文字列をルーン値のコレクションであるルーン スライスに変換します。ルーンは Unicode の文字単位であり、文字シーケンスをより正確に表現します。ルーン スライスを反復処理すると、シングルバイト文字またはマルチバイト文字を表すことができるルーン値が得られます。
違い:
決定的な違いは次のとおりです。ループ変数のインデックス。この例では、両方のループで、元の文字列のバイト インデックスを表す範囲変数 i が使用されます。ただし、ルーン スライスにまたがる場合、前のルーン値が複数バイトにまたがる場合、i は 1 バイト以上進む可能性があります。この動作は、常に 1 つの文字を表すバイトとは異なり、ルーン文字はさまざまなバイト長で文字をエンコードできるという事実によるものです。
結論:
範囲を超えている間文字列は単純に見えるかもしれませんが、マルチバイト文字を扱う場合には一貫性のない結果が生じる可能性があります。正確で信頼性の高い文字の反復を行うには、一般にルーン スライスにわたる範囲を推奨します。
以上がGo で「文字列の範囲」と「ルーン スライスの範囲」をいつ使用するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。