string в Go — неизменяемая последовательность байт. Внутри это заголовок из двух полей: указатель на данные + длина. Строки хранятся в UTF-8.
s := "Hello, мир"
fmt.Println(len(s)) // 14 (байт, не символов)
fmt.Println(s[0]) // 72 (байт 'H')
Нельзя изменить отдельный байт строки — s[0] = 'h' не скомпилируется. Для модификации нужно конвертировать в []byte или []rune, изменить и конвертировать обратно. Конкатенация создаёт новую строку каждый раз, поэтому для множественной склейки используй strings.Builder.