高效访问字符串的随机符文元素
在 Go 中,字符串表示为 UTF-8 编码字节序列。要访问特定索引处的符文元素,可以使用 for ... range 循环遍历字符串。然而,这种方法对于频繁访问来说可能效率低下。
这种低效的原因是 Go 的字符串不是直接在符文上建立索引的。要提取符文,必须对 UTF-8 字节序列进行解码。如果多次调用该函数,此解码开销会变得很大。
为了优化性能,建议避免使用字符串,而是使用 []rune 切片。切片被有效索引,允许直接访问符文。如果输入类型无法更改,则可以实现缓存来存储解码后的字符串 []rune 表示。
这里是所提供函数的修改版本,它使用缓存:
var cache = map[string][]rune{} func RuneAt(s string, idx int) rune { rs := cache[s] if rs == nil { rs = []rune(s) cache[s] = []rune(s) } if idx >= len(rs) { return 0 } return rs[idx] }
缓存存储解码后的字符串的 []rune 表示形式,以避免重复解码。如果使用有限的字符串集调用 RuneAt(),这种方法可以显着提高性能。
以上是如何高效访问Go字符串中的随机符文?的详细内容。更多信息请关注PHP中文网其他相关文章!