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