文字列のランダムなルーン要素に効率的にアクセスする
Go では、文字列は UTF-8 でエンコードされたバイトのシーケンスとして表されます。特定のインデックスにあるルーン要素にアクセスするには、for ... range ループを使用して文字列を反復処理します。ただし、この方法は頻繁にアクセスする場合には非効率になる可能性があります。
この非効率の理由は、Go の文字列がルーンに対して直接インデックス付けされていないためです。ルーンを抽出するには、UTF-8 バイト シーケンスをデコードする必要があります。このデコードのオーバーヘッドは、関数が複数回呼び出される場合に重大になります。
パフォーマンスを最適化するには、文字列の使用を避け、代わりに []rune スライスを使用することをお勧めします。スライスには効率的にインデックスが付けられ、ルーンへの直接アクセスが可能になります。入力タイプを変更できない場合は、デコードされた文字列の []rune 表現を保存するキャッシュを実装できます。
キャッシュを利用する、提供されている関数の修正バージョンを次に示します:
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] }
キャッシュには、反復的なデコードを避けるために、デコードされた文字列の []rune 表現が保存されます。このアプローチにより、限られた文字列セットで RuneAt() が呼び出される場合、パフォーマンスが大幅に向上します。
以上がGo String 内のランダムなルーンに効率的にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。