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 — невидимый ИИ-помощник для технических интервью
Попробовать бесплатно