Что делает этот фрагмент, когда индексирует и пытается присвоить s[0]?
Предскажите, что делает программа. Укажите точно, что даёт каждая строка — включая то, собирается ли она вообще — и объясните почему.
s := "test"
fmt.Println(s[0])
s[0] = "R"
fmt.Println(s)
Затем покажите, как поменять первый символ, если бы это понадобилось.
Определите причину.
Код не компилируется. Строка в Go — неизменяемая последовательность байтов только для чтения, поэтому s[0] = ... недопустимо. (s[0] читает byte, а не строку, так что "R" ещё и не тот тип.) Чтобы поменять байт, конвертируйте: b := []byte(s); b[0] = 'R'; s = string(b).
- ✗Думать, что строку можно менять на месте, присваивая по индексу как срезу
- ✗Считать, что
s[0]даёт строку из одного символа, а не значениеbyte - ✗Полагать, что присваивание компилируется и падает (или ничего не делает) в рантайме, а не является ошибкой сборки
- →Почему
fmt.Println(s[0])печатает число, а не буквуt? - →После
b := []byte(s)влияет ли изменениеbна исходную строкуs?
Что выведет
Программа не компилируется — она не доходит до запуска.
Строка в Go — это неизменяемая последовательность байтов только для чтения. Заголовок строки указывает на байтовый массив, который менять нельзя, поэтому s[0] = "R" — это ошибка компиляции «cannot assign to s[0]». Вдобавок выражение s[0] имеет тип byte (то есть uint8), а "R" — это string, так что присваивание не прошло бы по типам в любом случае.
Если бы код собрался, fmt.Println(s[0]) напечатал бы 116 — десятичный ASCII-код байта t, а не саму букву, потому что индексация строки возвращает байт, и Println печатает числовое значение.
Как поменять символ
Сконвертируйте в []byte, измените, сконвертируйте обратно:
s := "test"
b := []byte(s) // копия байтов — отдельный массив
b[0] = 'R' // 'R' — это rune/byte-литерал, не строка
s = string(b) // s == "Rest"
[]byte(s) создаёт копию байтов, поэтому исходная строка остаётся неизменной — её неизменяемость гарантирует, что значения строк можно безопасно разделять и использовать как ключи map. Для не-ASCII символов работайте через []rune, чтобы не разрезать многобайтовую UTF-8 последовательность.