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

String 如何将字符串的charAtIndex转换为ASCII等效的int值,string,go,golang-migrate,String,Go,Golang Migrate,我有一组字符串(ASCII),我想分配给一个字符串数组(第128章)。 字符串在数组中的位置由字符串的第一个字符的ASCII值决定。 像 strArr:=[128]字符串{} strA:=“一个字符串” strB:=“B字符串” strArr[65]=strA//因为strA以'A'开头&ASCII('A')=65 strArr[66]=strB//因为strB以'B'开头&ASCII('B')=66 有一种使用utf8包的解决方案,比如… r,:=utf8.decoderuneinnstri

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

strArr:=[128]字符串{}
strA:=“一个字符串”
strB:=“B字符串”
strArr[65]=strA//因为strA以'A'开头&ASCII('A')=65
strArr[66]=strB//因为strB以'B'开头&ASCII('B')=66
有一种使用
utf8
包的解决方案,比如…

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

是否可以对该解决方案进行时间优化?如果您可以确定字符串不是空的,并且它们的第一个符文在
0..127
范围内,您只需执行以下操作:

strArr[strA[0]] = strA
strArr[strB[0]] = strB
因为索引字符串索引其UTF-8编码的字节(这是Go在内存中存储字符串的方式),并且
0..127
范围内的符文映射到字节1到1,所以第一个字节是第一个
符文的值

当然,如果
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
    }
}
func set2(s字符串){
如果s!“”{
返回
}

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

strArr[strA[0]] = strA
strArr[strB[0]] = strB
因为索引字符串索引其UTF-8编码的字节(这是Go在内存中存储字符串的方式),并且
0..127
范围内的符文映射到字节1到1,所以第一个字节是第一个
符文的值

当然,如果
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
    }
}
func set2(s字符串){
如果s!“”{
返回
}
如果第一个:=s[0];第一个