Назад к вопросам
СБЕР
Middle
8
Что выведет программа с range по строке и изменением слайса?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
В Go при итерировании по строке с помощью range происходит обход по Unicode-рунам (runes), а не по байтам. Если при этом изменять срез (slice) строки, то это может привести к неожиданным результатам, так как строки в Go неизменяемы, и срезы создаются поверх исходных данных.
Пример:
package main
import "fmt"
func main() {
s := "hello"
for i, r := range s {
fmt.Printf("%d: %c\n", i, r)
if i == 1 {
s = "world" // изменение среза строки
}
}
}
Вывод будет:
0: h
1: e
2: l
3: l
4: o
Изменение строки внутри цикла не влияет на уже запущенный range, так как range по строке работает с исходными данными, и строка в Go неизменяема. Поэтому программа выведет символы исходной строки, а не новой.
Таким образом, изменение строки во время range не меняет поведение итерации, но делать так не рекомендуется, чтобы избежать путаницы.