Массивы и срезы: основы
Массивы
Массив — последовательность элементов фиксированной длины одного типа. Размер — часть типа: [3]int и [5]int — разные типы.
var a [5]int // нулевые значения: [0 0 0 0 0]
b := [3]string{"Go", "is", "fast"}
c := [...]int{1, 2, 3, 4} // компилятор считает длину
fmt.Println(len(b)) // 3
fmt.Println(b[1]) // "is"
Массив копируется при присваивании и передаче в функцию — значение, не ссылка.
x := [3]int{1, 2, 3}
y := x // копия
y[0] = 99
fmt.Println(x[0]) // 1 — x не изменился
Срезы
Срез — дескриптор для сегмента массива: три поля (ptr, len, cap).
s := []int{10, 20, 30, 40, 50}
sub := s[1:4] // [20 30 40]
fmt.Println(len(sub), cap(sub)) // 3, 4
Срез не копирует данные — указывает на тот же массив:
sub[0] = 99
fmt.Println(s) // [10 99 30 40 50]
make и append
// make([]T, len, cap)
s := make([]int, 0, 10) // пустой срез, зарезервировано 10 мест
// append добавляет элементы, при необходимости перевыделяет память
s = append(s, 1, 2, 3)
s = append(s, []int{4, 5, 6}...)
Итог
| Свойство | Массив | Срез |
|---|---|---|
| Длина | Фиксирована | Динамическая |
| Тип | [N]T | []T |
| Передача | Копия | Ссылка на данные |
| Нулевое значение | Нулевой массив | nil |
| Использование | Редко | Везде |
Упражнения
| № | Задание | Сложность |
|---|---|---|
| 1 | Упражнение 1 | easy |
| 2 | Упражнение 2 | easy |
| 3 | Упражнение 3 | medium |
| 4 | Упражнение 4 | medium |