Maison > développement back-end > Golang > Comment puis-je accéder efficacement aux runes aléatoires dans les chaînes Go sans utiliser de boucles For ?

Comment puis-je accéder efficacement aux runes aléatoires dans les chaînes Go sans utiliser de boucles For ?

Mary-Kate Olsen
Libérer: 2024-11-24 07:01:10
original
463 Les gens l'ont consulté

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

Accès aux éléments runiques aléatoires dans les chaînes

Problème

Comment des éléments runiques aléatoires dans un la chaîne soit accessible efficacement sans compter sur "for ... range" boucles ?

Arrière-plan

Les chaînes Go stockent des séquences d'octets codées en UTF-8. Alors que les boucles "for ... range" permettent un décodage et une récupération efficaces des runes, l'accès aux runes via une fonction directe comme "str.At(i)" n'est pas disponible. Cela oblige les développeurs à rechercher des méthodes alternatives pour un accès fréquent aux runes.

Solution

Comme mentionné dans la réponse fournie, les limitations suivantes s'appliquent :

  • Les valeurs de chaîne dans Go contiennent des séquences d'octets UTF-8, nécessitant un décodage pour la récupération des runes.
  • La représentation sous forme de chaîne ne ne fournit pas d'accès direct aux runes à des index arbitraires.

Recommandation

Pour optimiser les performances, envisagez de convertir les chaînes d'entrée en une tranche de runes ([]rune) si l'accès aux runes est fréquemment requis. Contrairement aux chaînes, qui sont effectivement des tranches d'octets en lecture seule, les tranches de runes permettent une indexation efficace.

Alternative

Si la conversion d'entrée n'est pas réalisable, un cache peut être implémenté pour mapper les chaînes à leurs tranches de rune correspondantes. Cela améliore les performances dans les cas impliquant un petit ensemble de chaînes récurrentes. Cependant, pour les chaînes uniques ou peu fréquentes, la mise en cache peut devenir inefficace et consommer une mémoire excessive.

Exemple

L'extrait de code suivant illustre une implémentation simple du cache pour la récupération des runes :

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))
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal