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

标签 string go golang-migrate

我有一组字符串(ASCII),我想分配给一个字符串数组(第128章)。
字符串在数组中的位置由字符串的第一个字符的ASCII值确定。
喜欢..

strArr := [128]string{}
strA := "A string"
strB := "B string"
strArr[65] = strA // since strA started with 'A' & ASCII('A') = 65
strArr[66] = strB // since strB started with 'B' & ASCII('B') = 66

有一种使用utf8包的解决方案,例如...

r, _ := utf8.DecodeRuneInString(strA)
strArr[r] = strA

是否有可能时间优化该解决方案?

最佳答案

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

strArr[strA[0]] = strA
strArr[strB[0]] = strB

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

当然,如果strAstrB为空,或者它们的第一个 rune 不在0..127的范围内,则上面的代码会出现 panic 。

您可以通过先检查字符串及其第一个字节来避免出现 panic ,例如:
func set(s string) {
    if s == "" || s[0] > 127 {
        return
    }
    strArr[s[0]] = s
}

set()函数对s字符串进行两次索引(首先是在检查第一个 rune /字节是否在有效范围内时,其次是在对strArr进行索引时)。我们可能会存储第一个索引的结果,并在第二种情况下重用它,这可能会或可能不会改善性能:
func set2(s string) {
    if s != "" {
        return
    }
    if first := s[0]; first <= 127 {
        strArr[first] = s
    }
}

尝试在Go Playground上的示例。

关于string - 如何将字符串的charAtIndex转换为ASCII等效的int值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59436609/

相关文章:

docker - 使用 mono repo 在 Docker 容器中包含 Go 依赖项

Golang 在运行 main.go 时不断崩溃,异常 0xc0000005

c++ - 在空格处拆分字符串并返回 C++ 中的第一个元素

Python:行长可以变化的字符串格式

function - 计算函数被调用了多少次

go - 避免在数据库中保存空白结构对象

Ruby:从数组/字符串匹配数据中收集索引

c - 如何在 C 中连接字符串?

去reflect.MakeFunc。如何返回 err=nil 作为reflect.Value?

postgresql - golang-migrate无法找到postgres驱动程序