ホームページ >バックエンド開発 >Golang >Go String のランダムなルーン要素に効率的にアクセスするにはどうすればよいですか?

Go String のランダムなルーン要素に効率的にアクセスするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-28 18:08:11977ブラウズ

How Can I Efficiently Access Random Rune Elements in Go Strings?

文字列内のランダムなルーン要素に効率的にアクセスする

Go では、文字列がシーケンスとして表現されるため、文字列のランダムなルーン要素にアクセスするのは困難ですUTF-8 でエンコードされたバイト数。利用可能な str[i] 演算子はバイトを返しますが、for ... range はバイトを自動的にデコードしてルーン要素を提供します。

反復アプローチの非効率

反復質問で提供されているアプローチ、RuneElement() は、文字列を繰り返し反復して、指定されたインデックスにある要素を取得します。このアプローチは機能しますが、頻繁なアクセスでは非効率になる可能性があります。

なぜ直接アクセス機能がないのですか?

文字列をバイト シーケンスとして表現するという設計上の決定により、 str.At(i) のような、特定のインデックスのルーン要素を直接返すことができる組み込み関数はありません。 UTF-8 デコード プロセスはルーン要素にアクセスするために不可欠であり、バイパスできません。

効率化のためのキャッシュ

特定の要素に対してランダムなルーン アクセスが頻繁に必要な場合文字列のセットをキャッシュすると効率が向上します。キャッシュ メカニズムの例を次に示します。

var cache = map[string][]rune{}

func RuneAt(s string, idx int) rune {
    rs := cache[s]
    if rs == nil {
        rs = []rune(s)
        cache[s] = []rune(s)
    }
    if idx >= len(rs) {
        return 0
    }
    return rs[idx]
}

このキャッシュは、文字列から対応するルーン スライスへのマッピングを保存します。文字列が以前にキャッシュされていない場合は、将来のアクセスに備えてデコードされてキャッシュされます。キャッシュにより、同じ文字列のルーン要素に頻繁にアクセスする場合のパフォーマンスが大幅に向上します。

以上がGo String のランダムなルーン要素に効率的にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。