ENIGMA AI
ENIGMA AI
Go Средний

Расскажите про массивы и слайсы в Go

Массивы и слайсы в Go

Массивы (Arrays)

Фиксированный размер, часть типа:

var arr [5]int              // [0 0 0 0 0]
arr := [3]int{1, 2, 3}      // [1 2 3]
arr := [...]int{1, 2, 3}    // Размер вычисляется

Массивы — value types:

a := [3]int{1, 2, 3}
b := a        // Копирование!
b[0] = 10
fmt.Println(a)  // [1 2 3] — не изменился

Слайсы (Slices)

Динамический размер, ссылка на массив:

s := []int{1, 2, 3}         // Слайс
s := make([]int, 5)         // len=5, cap=5
s := make([]int, 0, 10)     // len=0, cap=10

Структура слайса:

type slice struct {
    array unsafe.Pointer  // Указатель на массив
    len   int             // Длина
    cap   int             // Ёмкость
}

Операции со слайсами:

s := []int{1, 2, 3, 4, 5}

// Срез
s[1:3]    // [2 3]
s[:3]     // [1 2 3]
s[2:]     // [3 4 5]

// Добавление
s = append(s, 6)
s = append(s, 7, 8, 9)
s = append(s, other...)

// Копирование
dst := make([]int, len(src))
copy(dst, src)

Gotcha: общий underlying array

original := []int{1, 2, 3, 4, 5}
slice := original[1:3]  // [2 3]

slice[0] = 20
fmt.Println(original)  // [1 20 3 4 5] — изменился!

// Безопасное копирование:
slice := make([]int, 2)
copy(slice, original[1:3])

Расширение при append:

s := make([]int, 0, 2)
fmt.Printf("len=%d cap=%d\n", len(s), cap(s))  // 0, 2

s = append(s, 1, 2, 3)  // Превышает capacity
fmt.Printf("len=%d cap=%d\n", len(s), cap(s))  // 3, 4

// Capacity удваивается (примерно) при переполнении

Удаление элемента:

// Удалить элемент с индексом i
s = append(s[:i], s[i+1:]...)

// Или (сохраняет порядок):
s = slices.Delete(s, i, i+1)  // Go 1.21+

nil vs empty slice:

var nilSlice []int        // nil, len=0, cap=0
emptySlice := []int{}     // не nil, len=0, cap=0
madeSlice := make([]int, 0)  // не nil, len=0, cap=0

// Все работают с append, range, len
// Но JSON encoding различается:
// nil → null
// [] → []

Похожие вопросы

Готовитесь к собеседованию?

ENIGMA AI — невидимый ИИ-помощник для технических интервью

Попробовать бесплатно
Все вопросы