MiddleКодИногдаЕщё не отвечали
После этих записей по индексу через y и z что выведут x, y и z?
Проследите каждую запись по индексу через reslice и приведите три выведенные строки.
func slicesSharedMem() {
x := []string{"a", "b", "c", "d"}
y := x[:2]
z := x[1:]
x[1] = "y"
y[0] = "x"
z[1] = "z"
fmt.Println("x:", x)
fmt.Println("y:", y)
fmt.Println("z:", z)
}
Определите вывод.
Выведет x: [x y z d], y: [x y], z: [y z d]. И y := x[:2], и z := x[1:] — это reslice x, поэтому они делят его backing array. x[1]="y", y[0] пишет в x[0]="x", а z[1] пишет в x[2]="z" — всё видно через любой перекрывающийся диапазон.
- ✗Считать, что reslice копирует элементы —
x[:2]иx[1:]смотрят на тот же backing arrayx - ✗Сопоставлять
z[1]с индексом 1x, а не 2 —zначинается со смещения 1, поэтомуz[1]— этоx[2] - ✗Ожидать панику — каждый индекс здесь в пределах длины своего среза
- →Как изменился бы результат, если бы
yстроился черезcopy, а неx[:2]? - →Почему
z[1]отображается наx[2], а не наx[1]?
Оглавление
Что выведет код?
x := []string{"a", "b", "c", "d"}
y := x[:2]
z := x[1:]
x[1] = "y"
y[0] = "x"
z[1] = "z"
Вывод
x: [x y z d]
y: [x y]
z: [y z d]
Почему записи видны всем срезам
y := x[:2] и z := x[1:] — это reslice x: они не копируют элементы, а смотрят на тот же backing array. Их смещения относительно x:
yначинается с индекса 0 (y[0]↔x[0]).zначинается с индекса 1 (z[1]↔x[2]).
Прогон записей по x:
x[1] = "y"→x = [a y c d].y[0] = "x"пишет вx[0]→x = [x y c d].z[1] = "z"пишет вx[2]→x = [x y z d].
Итог: x = [x y z d], y = x[:2] = [x y], z = x[1:] = [y z d].
Оглавление