如何将字符串的 charAtIndex 转换为 ASCII 等效 int 值
How to convert a charAtIndex of string to ASCII equivalent int value
我有一组字符串 (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
是否可以对这个解决方案进行时间优化?
如果你能确定你的字符串不为空并且它们的第一个符文在0..127
的范围内,你可以简单地做:
strArr[strA[0]] = strA
strArr[strB[0]] = strB
因为索引字符串索引它们的 UTF-8 编码字节(这就是 Go 在内存中存储字符串的方式),并且 0..127
范围内的符文映射到字节 1 对 1,所以第一个字节是第一个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 上的示例。
我有一组字符串 (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
是否可以对这个解决方案进行时间优化?
如果你能确定你的字符串不为空并且它们的第一个符文在0..127
的范围内,你可以简单地做:
strArr[strA[0]] = strA
strArr[strB[0]] = strB
因为索引字符串索引它们的 UTF-8 编码字节(这就是 Go 在内存中存储字符串的方式),并且 0..127
范围内的符文映射到字节 1 对 1,所以第一个字节是第一个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 上的示例。