Что произойдет при попытке изменить символ строки по индексу в Python и почему
Что проверяют
Знаете ли вы, что строка неизменяема, и умеете ли перенести это на свой язык. Для Go вопрос ровно тот же, только ошибка возникает раньше, и за ним почти всегда идёт продолжение про байты и руны.
Как отвечать
В Python s[0] = "H" даёт TypeError: 'str' object does not support item assignment. Строку меняют только сборкой новой: срезами и склейкой, replace, либо через list(s) и обратный "".join(...).
В Go ограничение жёстче: код просто не компилируется, потому что строка это неизменяемая пара из указателя на байты и длины.
s := "hello"
s[0] = 'H' // cannot assign to s[0]
b := []byte(s)
b[0] = 'H'
s = string(b) // каждая конверсия это копияСмысл неизменяемости стоит проговорить: строку можно без копирования передавать между горутинами и класть ключом в map, а срез строки делит тот же буфер и не аллоцирует.
Дальше идёт то, ради чего вопрос и задают. Индекс у строки в Go возвращает байт, а не символ, поэтому s[0] это число. Символы это руны: []rune(s) или range, который сам декодирует UTF-8 и отдаёт позицию в байтах. А для сборки строки в цикле нужен strings.Builder, он растит один буфер вместо создания новой строки на каждое сложение.
Где спотыкаются
Правят «символ» через []byte на тексте, где есть кириллица. Одна буква там занимает два байта, замена одного даёт битую последовательность и символ замены при выводе. Для правки по символам нужен []rune, и это стоит сказать самому, не дожидаясь наводящего вопроса.
Считают len(s) количеством символов. У строки в Go это длина в байтах, символы считает utf8.RuneCountInString. Привычка из Python, где длина это число кодовых точек, здесь даёт ошибку ровно на нелатинских данных, то есть на проде и никогда на тестовом примере.
Останавливаются на словах «неизменяемость нужна для безопасности» и не называют следствия. А следствия два, и оба практические: конкатенация в цикле квадратична по времени, потому что каждая операция аллоцирует новую строку, и общий доступ к строке из нескольких горутин не требует блокировок.