Массивы и срезы: основы

Массив — последовательность элементов фиксированной длины одного типа. Размер — часть типа: [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([]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Упражнение 1easy
2Упражнение 2easy
3Упражнение 3medium
4Упражнение 4medium