Паттерны работы со срезами

Удалить элемент по индексу 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
var s []int          // nil-срез: s == nil, len=0
s2 := []int{}        // пустой: s2 != nil, len=0

Оба допускают append, итерацию range и передачу в функции. Различие важно только при сериализации в JSON: nil → null, []int{}[].


ЗаданиеСложность
1Упражнение 1medium
2Упражнение 2medium
3Упражнение 3hard