← Назад к вопросам

Когда используется слайс?

1.0 Junior🔥 201 комментариев
#Основы Go

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Когда использовать слайсы в Go

Слайс — это динамический, гибкий вид на последовательность элементов в Go. Это один из наиболее важных и часто используемых типов данных в языке.

Основные характеристики слайса

Слайс состоит из трёх компонентов:

  • Указатель на элементы массива
  • Длина (length) — текущее количество элементов
  • Ёмкость (capacity) — максимальное количество элементов, которое может содержать подлежащий массив

Основные случаи использования

1. Когда размер коллекции заранее неизвестен

// Прочитать неизвестное количество строк из файла
var lines []string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
    lines = append(lines, scanner.Text())
}

2. Для передачи переменного количества аргументов

func Sum(numbers ...int) int { // ...int это слайс
    total := 0
    for _, num := range numbers {
        total += num
    }
    return total
}

Sum(1, 2, 3)       // Вызов с несколькими элементами
Sum()              // Можно даже без элементов

3. Для работы с частями данных (subslicing)

data := []int{1, 2, 3, 4, 5}
first := data[0:2]   // [1, 2]
middle := data[1:4]  // [2, 3, 4]
last := data[3:]     // [4, 5]

4. Когда нужна передача по ссылке с изменением размера

func AppendItem(items []string, item string) []string {
    return append(items, item)
}

list := []string{"a", "b"}
list = AppendItem(list, "c") // Слайс передаётся, результат переприсваивается

Слайс vs Массив

Массив — фиксированный размер, известен на этапе компиляции:

var arr [5]int      // Массив из 5 элементов
arr[0] = 10         // Доступ к элементу

Слайс — динамический размер, может расти:

var slice []int     // Слайс без размера
slice = append(slice, 10)
slice = append(slice, 20)

Инициализация слайсов

// Пустой слайс
var empty []int

// С make — заранее выделить ёмкость
preallocated := make([]int, 0, 10) // длина 0, ёмкость 10

// Слайс с инициализацией
initialized := []int{1, 2, 3}

// Из массива
arr := [3]int{1, 2, 3}
sliceFromArr := arr[:] // Конвертация в слайс

Производительность: Предвыделение ёмкости

// Плохо — многократное перевыделение памяти при append
var result []string
for i := 0; i < 1000000; i++ {
    result = append(result, "item")
}

// Хорошо — предвыделить ёмкость
result := make([]string, 0, 1000000)
for i := 0; i < 1000000; i++ {
    result = append(result, "item")
}

Практические рекомендации

  • Используй слайсы по умолчанию — они более гибкие чем массивы
  • Массивы только когда размер фиксирован — например, SHA256 всегда 32 байта
  • Всегда предвыделяй ёмкость, если знаешь примерный размер — улучшит производительность
  • Помни о разделении памяти — два слайса могут указывать на одни и те же элементы
  • Используй copy() для глубокого копирования — если нужна полная независимость

Выбор между слайсом и массивом определяется тем, известен ли размер заранее и нужна ли динамическая гибкость во время выполнения.