Go における文字列の範囲指定とルーン スライスの違いは何ですか?

Susan Sarandon
リリース: 2024-10-29 22:12:02
オリジナル
751 人が閲覧しました

What's the difference between ranging over strings and rune slices in Go?

文字列の範囲指定とルーン スライスの区別

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 サイトの他の関連記事を参照してください。

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