Комментарии (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() для глубокого копирования — если нужна полная независимость
Выбор между слайсом и массивом определяется тем, известен ли размер заранее и нужна ли динамическая гибкость во время выполнения.