Sobes.tech
Back to questions
Middle
7

Что выведет программа с range по строке и изменением слайса?

Companies where asked
СБЕРСБЕР

Answer from AI

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 не меняет поведение итерации, но делать так не рекомендуется, чтобы избежать путаницы.