Паттерны работы со срезами
Удаление элемента
Удалить элемент по индексу i, сохранив порядок:
s = append(s[:i], s[i+1:]...)
Без сохранения порядка (быстрее — без сдвига):
s[i] = s[len(s)-1]
s = s[:len(s)-1]
Фильтрация на месте
Принцип «write pointer» — перезаписываем срез прямо в себя:
func filter(s []int, keep func(int) bool) []int {
n := 0
for _, v := range s {
if keep(v) {
s[n] = v
n++
}
}
return s[:n]
}
Двумерные срезы
matrix := make([][]int, 3)
for i := range matrix {
matrix[i] = make([]int, 4)
}
matrix[1][2] = 7
nil-срез vs пустой срез
var s []int // nil-срез: s == nil, len=0
s2 := []int{} // пустой: s2 != nil, len=0
Оба допускают append, итерацию range и передачу в функции. Различие важно только при сериализации в JSON: nil → null, []int{} → [].
Упражнения
| № | Задание | Сложность |
|---|---|---|
| 1 | Упражнение 1 | medium |
| 2 | Упражнение 2 | medium |
| 3 | Упражнение 3 | hard |