For ループを使用せずに Go 文字列内のランダム ルーンに効率的にアクセスするにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-24 07:01:10
オリジナル
378 人が閲覧しました

How Can I Efficiently Access Random Runes in Go Strings Without Using For Loops?

文字列内のランダムなルーン要素へのアクセス

問題

文字列内のランダムなルーン要素はどのようにして実行できますか? 「for ... range」に依存せずに文字列に効率的にアクセスできるようになります。ループ?

Background

Go 文字列には、UTF-8 でエンコードされたバイト シーケンスが格納されます。 「for ... range」ループを使用するとルーン文字の効率的なデコードと取得が可能になりますが、「str.At(i)」のような直接関数を介してルーン文字にアクセスすることはできません。このため、開発者は頻繁にルーンにアクセスするための代替方法を模索することになります。

解決策

提供された応答で述べたように、次の制限が適用されます:

  • Go の文字列値には UTF-8 バイト シーケンスが含まれているため、ルーンのデコードが必要です取得。
  • 文字列表現では、任意のインデックスでの直接のルーン アクセスは提供されません。

推奨事項

パフォーマンスの最適化のために、入力の変換を検討してください。ルーンへのアクセスが頻繁に必要な場合は、文字列をルーンのスライス ([]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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート