Как преобразовать charAtIndex строки в эквивалентное значение int в ASCII
У меня есть набор строк (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
Можно ли оптимизировать это решение по времени?
1 ответ
Если вы можете быть уверены, что ваши строки не пусты и их первая руна находится в диапазоне 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.