gpt4 book ai didi

string - 在不使用 for ... range 的情况下访问字符串的随机 rune 元素

转载 作者:IT王子 更新时间:2023-10-29 01:57:54 26 4
gpt4 key购买 nike

我最近问了this问题和答案增加了我的理解,但它们并没有解决我遇到的实际问题。因此,我将尝试提出一个类似但不同的问题如下。

假设我想访问 string 的随机 rune 元素。一种方法是:

func RuneElement(str string, idx int) rune {
var ret rune
for i, c := range str {
if i == idx {
return c
}
}
return ret // out of range -> proper handling is needed
}

如果我想多次调用这样的函数怎么办?我想我正在寻找的是像 str[i] 这样的运算符/函数(它返回一个 byte),它返回 rune 元素在第 i 位置。为什么可以使用 for ... range 访问此元素,但不能通过 str.At(i) 等函数访问?

最佳答案

Go 中的

string 值存储文本的 UTF-8 编码字节序列。这是已经做出的设计决定,不会改变。

如果你想在任意索引处有效地从中获取 rune,你必须解码字节,对此你无能为力(for ... range 做这个解码)。没有“捷径”。所选择的表示并没有立即提供这一点。

如果你必须经常/多次这样做,你应该改变你的输入,而不是使用 string,而是 []rune,因为它是一个 slice ,可以有效索引。 Go 中的 string 不是 []rune。 Go 中的 string 实际上是只读的 []byte (UTF-8)。期间。

如果你不能改变输入类型,你可以构建一个从string映射到它的[]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]
}

这是否值得取决于具体情况:如果使用一小组 string 调用 RuneAt(),这可能会大大提高性能。如果传递的字符串或多或少是唯一的,这将导致性能下降和大量内存使用。此外,此实现对于并发使用并不安全。

关于string - 在不使用 for ... range 的情况下访问字符串的随机 rune 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44527223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com