文字列内のルーン要素への効率的なアクセス
for ループの使用を避けようとすると、Go で文字列のルーン要素にアクセスするのが困難になることがあります。この記事では、この制限が存在する理由を検討し、効率的にルーンを取得するための解決策を提供します。
バックグラウンド
一部のプログラミング言語とは異なり、Go は文字列値を UTF-8 でエンコードされたバイトとして保存します。シーケンス。この決定により、str.At(i) のような関数を使用して、文字列内の文字を表すルーンに直接アクセスする機能が制限されます。
ルーンへのアクセス
アクセスするには特定のインデックスにあるルーンの場合は、バイト シーケンスをデコードする必要があります。 for ... range ループはこのデコードを実行します。ただし、頻繁にルーンを取得するためにこのループに依存すると、非効率になる可能性があります。
最適化
ルーンの取得が頻繁な操作である場合、最適化されたアプローチは入力文字列を変換することです。 []ルーンスライスに。 []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] }
結論
文字列内のルーン文字に効率的にアクセスするには、特定の使用例を慎重に検討する必要があります。頻繁かつ選択的なルーン取得の場合、[]ルーン スライスまたはキャッシュ メカニズムにより最適なパフォーマンスを提供できます。
以上がループを使用せずに Go String 内の個々の Runes に効率的にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。