Heim >Backend-Entwicklung >Golang >Wie kann ich effizient auf zufällige Runen in Go-Strings zugreifen, ohne For-Schleifen zu verwenden?

Wie kann ich effizient auf zufällige Runen in Go-Strings zugreifen, ohne For-Schleifen zu verwenden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-24 07:01:10457Durchsuche

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

Zugriff auf zufällige Runenelemente in Strings

Problem

Wie können zufällige Runenelemente innerhalb eines Auf die Zeichenfolge kann effizient zugegriffen werden, ohne auf „for ... range“ angewiesen zu sein. Schleifen?

Hintergrund

Go-Strings speichern UTF-8-codierte Bytesequenzen. Während „for ... range“-Schleifen ein effizientes Dekodieren und Abrufen von Runen ermöglichen, ist der Zugriff auf Runen über eine direkte Funktion wie „str.At(i)“ nicht verfügbar. Dies führt dazu, dass Entwickler nach alternativen Methoden für den häufigen Runenzugriff suchen.

Lösung

Wie in der bereitgestellten Antwort erwähnt, gelten die folgenden Einschränkungen:

  • String-Werte in Go enthalten UTF-8-Bytesequenzen, die für den Runenabruf eine Dekodierung erfordern.
  • Die Die Zeichenfolgendarstellung bietet keinen direkten Runenzugriff auf beliebige Indizes.

Empfehlung

Zur Leistungsoptimierung sollten Sie die Konvertierung von Eingabezeichenfolgen in ein Runensegment in Betracht ziehen ([] Rune), wenn der Runenzugriff häufig erforderlich ist. Im Gegensatz zu Strings, bei denen es sich praktisch um schreibgeschützte Byte-Slices handelt, ermöglichen Runen-Slices eine effiziente Indizierung.

Alternative

Wenn eine Eingabekonvertierung nicht möglich ist, kann ein Cache implementiert werden um Zeichenfolgen den entsprechenden Runenabschnitten zuzuordnen. Dies verbessert die Leistung in Fällen, in denen es um eine kleine Menge wiederkehrender Zeichenfolgen geht. Bei eindeutigen oder seltenen Zeichenfolgen kann das Caching jedoch ineffizient werden und übermäßig viel Speicher verbrauchen.

Beispiel

Der folgende Codeausschnitt zeigt eine einfache Cache-Implementierung für den Runenabruf:

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))
    }
}

Das obige ist der detaillierte Inhalt vonWie kann ich effizient auf zufällige Runen in Go-Strings zugreifen, ohne For-Schleifen zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn