Ответ 1
Сначала вы можете прочитать https://blog.golang.org/strings Он ответит на часть ваших вопросов.
Строка в Go может содержать произвольные байты. Когда вы пишете str [i], результатом является байт, а индекс всегда имеет количество байтов.
В большинстве случаев строки кодируются в UTF-8. У вас есть несколько способов борьбы с кодировкой UTF-8 в строке.
Например, вы можете использовать оператор for... range для итерации по строке rune by rune.
var first rune
for _,c := range str {
first = c
break
}
// first now contains the first rune of the string
Вы также можете использовать пакет unicode/utf8. Например:
r, size := utf8.DecodeRuneInString(str)
// r contains the first rune of the string
// size is the size of the rune in bytes
Если строка кодируется в UTF-8, прямой доступ к n-й руне строки отсутствует, поскольку размер рун (в байтах) не является постоянным. Если вам нужна эта функция, вы можете легко написать свою собственную вспомогательную функцию, чтобы сделать это (с диапазоном... или с пакетом unicode/utf8).