访问字符串中的随机符文元素
问题
如何在字符串中访问随机符文元素无需依赖“for ... range”即可高效访问字符串循环?
背景
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中文网其他相关文章!