Как преобразовать 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.

Другие вопросы по тегам