JuniorКодИногдаЕщё не отвечали
Что выведет этот сниппет со slice-выражениями для x, y, z, d и e?
Определите каждую выведенную строку и объясните, что выбирает x[low:high].
func slicesExample() {
x := []string{"a", "b", "c", "d"}
y := x[:2]
z := x[1:]
d := x[1:3]
e := x[:]
fmt.Println("x:", x)
fmt.Println("y:", y)
fmt.Println("z:", z)
fmt.Println("d:", d)
fmt.Println("e:", e)
}
Определите вывод.
Выведет x: [a b c d], y: [a b], z: [b c d], d: [b c], e: [a b c d]. Форма x[low:high] берёт элементы с индекса low по high-1, поэтому её длина равна high-low; опущенная граница по умолчанию равна 0 или len(x).
- ✗Считать границу
highвключительной —x[1:3]берёт индексы 1 и 2, а не 1, 2, 3 - ✗Забывать, что опущенный low по умолчанию равен
0, а опущенный high —len(x) - ✗Считать, что
x[:]копирует массив — он возвращает срез по тому же backing array
- →Какую ёмкость (cap) имеет
y := x[:2]и почему не 2? - →Как скопировать элементы, чтобы результат не делил backing array с
x?
Оглавление
Что выведет код?
x := []string{"a", "b", "c", "d"}
y := x[:2]
z := x[1:]
d := x[1:3]
e := x[:]
Вывод
x: [a b c d]
y: [a b]
z: [b c d]
d: [b c]
e: [a b c d]
Как читать выражение среза
Выражение x[low:high] полуоткрытое: оно берёт элементы с индекса low по high-1 включительно, а длина результата равна high-low.
y := x[:2]— опущенный low равен0: индексы 0..1 →[a b].z := x[1:]— опущенный high равенlen(x): индексы 1..3 →[b c d].d := x[1:3]— индексы 1..2 →[b c].e := x[:]— оба конца опущены: весь срез →[a b c d].
⚠️ x[:] не копирует массив — все эти срезы делят один backing array с x. Чтобы получить независимую копию, используйте copy или append в новый срез.
Оглавление