为了账号安全,请及时绑定邮箱和手机立即绑定

如何将字符串的 charAtIndex 转换为 ASCII 等效 int 值

如何将字符串的 charAtIndex 转换为 ASCII 等效 int 值

Go
慕田峪9158850 2023-08-14 16:22:57
我有一组字符串 (ASCII),我想将其分配给一个字符串数组(第 128 章)。字符串在数组中的位置由字符串第一个字符的 ASCII 值决定。喜欢..strArr := [128]string{}strA := "A string"strB := "B string"strArr[65] = strA // since strA started with 'A' & ASCII('A') = 65strArr[66] = strB // since strB started with 'B' & ASCII('B') = 66有一种使用utf8包的解决方案,例如......r, _ := utf8.DecodeRuneInString(strA)strArr[r] = strA是否可以对这个解决方案进行时间优化?
查看完整描述

1 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

如果您可以确定您的字符串不为空并且它们的第一个符文在 的范围内0..127,您可以简单地执行以下操作:


strArr[strA[0]] = strA

strArr[strB[0]] = strB

因为索引字符串索引它们的 UTF-8 编码字节(这就是 Go 在内存中存储字符串的方式),而符文在映射到字节 1 到 1 的范围内0..127,所以第一个字节是第一个 的值rune。


当然,如果strA或strB为空或者它们的第一个符文不落在 的范围内0..127,上面的代码将会出现恐慌。


您可以通过检查字符串及其之前的第一个字节来避免恐慌,例如:


func set(s string) {

    if s == "" || s[0] > 127 {

        return

    }

    strArr[s[0]] = s

}

此set()函数对s字符串进行两次索引(第一次是在检查第一个符文/字节是否在有效范围内时,第二次是在索引时strArr)。我们可以存储第一个索引的结果并在第二种情况下重用该结果,这可能会也可能不会提高性能:


func set2(s string) {

    if s != "" {

        return

    }

    if first := s[0]; first <= 127 {

        strArr[first] = s

    }

}

尝试Go Playground上的示例。



查看完整回答
反对 回复 2023-08-14
  • 1 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信