文字列内のランダムなルーン要素へのアクセス
問題
文字列内のランダムなルーン要素はどのようにして実行できますか? 「for ... range」に依存せずに文字列に効率的にアクセスできるようになります。ループ?
Background
Go 文字列には、UTF-8 でエンコードされたバイト シーケンスが格納されます。 「for ... range」ループを使用するとルーン文字の効率的なデコードと取得が可能になりますが、「str.At(i)」のような直接関数を介してルーン文字にアクセスすることはできません。このため、開発者は頻繁にルーンにアクセスするための代替方法を模索することになります。
解決策
提供された応答で述べたように、次の制限が適用されます:
推奨事項
パフォーマンスの最適化のために、入力の変換を検討してください。ルーンへのアクセスが頻繁に必要な場合は、文字列をルーンのスライス ([]rune) に追加します。実質的に読み取り専用のバイト スライスである文字列とは異なり、ルーンのスライスを使用すると、効率的なインデックス作成が可能になります。
代替
入力変換が不可能な場合は、キャッシュを実装できます。文字列を対応するルーン スライスにマッピングします。これにより、少数の繰り返し文字列が含まれる場合のパフォーマンスが向上します。ただし、固有の文字列や使用頻度が低い文字列の場合、キャッシュが非効率になり、過剰なメモリを消費する可能性があります。
例
次のコード スニペットは、ルーン取得のための単純なキャッシュ実装を示しています。
import ( "fmt" "sync" ) var cache = sync.Map{} func RuneAt(s string, idx int) rune { rs, ok := cache.Load(s) if !ok { rs = []rune(s) cache.Store(s, rs) } if idx >= len(rs) { return 0 } return rs[idx] } func main() { str := "你好,世界!" for i := 0; i < len(str); i++ { fmt.Printf("%c ", RuneAt(str, i)) } }
以上がFor ループを使用せずに Go 文字列内のランダム ルーンに効率的にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。