登录
首页 >  Golang >  Go问答

在不使用 for ... 范围的情况下访问字符串的随机符文元素

来源:Golang技术栈

时间:2023-05-01 11:32:42 152浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个Golang开发实战,手把手教大家学习《在不使用 for ... 范围的情况下访问字符串的随机符文元素》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

问题内容

我最近问[了这个](https://stackoverflow.com/questions/44487910/does-accessing- elements-of-string-as-byte-perform- conversion)问题,答案增加了我的理解,但他们并没有解决我遇到的实际问题。因此,我将尝试提出一个类似但不同的问题,如下所示。

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

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](返回 a byte),它返回第 -th 位置的rune元素。i为什么可以使用for ... range但不能通过str.At(i)例如函数访问此元素?

正确答案

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

如果您想rune在任意索引处有效地从中获取 a,则必须对字节进行解码,对此您无能为力(进行for ... range此解码)。没有“捷径”。选择的表示并没有提供开箱即用的功能。

如果您必须经常/多次执行此操作,您应该更改输入而不是使用stringa []rune,因为它是一个切片并且可以有效地被索引。string在 Go 中不是[]runestring在 Go 中实际上是只读的[]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]
}

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

今天关于《在不使用 for ... 范围的情况下访问字符串的随机符文元素》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表