Ответ
Способ очистки зависит от структуры данных и цели: нужно ли сохранить выделенную память для переиспользования или полностью освободить её.
Слайсы (Slices)
-
Очистка с сохранением
capacity
(быстро): Этот способ "обнуляет" длину слайса, но оставляет базовый массив в памяти. Идеально для переиспользования.s := []int{1, 2, 3, 4, 5} // cap(s) == 5 s = s[:0] // len(s) == 0, cap(s) == 5 // Память не освобождена, готова к новому заполнению без аллокаций.
-
Полное освобождение памяти: Чтобы сборщик мусора мог освободить память, занимаемую базовым массивом, присвойте слайсу
nil
.s := make([]int, 1000000) // Большой слайс s = nil // Теперь GC может собрать массив, если на него нет других ссылок.
Мапы (Maps)
-
Очистка с помощью
clear()
(Go 1.21+): Это самый эффективный и предпочтительный способ. Он удаляет все элементы, но сохраняет выделенную под мапу память для будущего использования.// Требуется Go 1.21 или новее m := map[string]int{"a": 1, "b": 2} clear(m) // len(m) == 0, но память под бакеты сохранена.
-
Пересоздание мапы (универсальный способ): Этот способ создает новую пустую мапу, а старая будет убрана сборщиком мусора. Это приводит к новой аллокации памяти.
m := map[string]int{"a": 1, "b": 2} m = make(map[string]int) // Старая мапа будет удалена GC.
Действие | Слайс | Мапа (Go 1.21+) | Мапа (старые версии) |
---|---|---|---|
Очистить, сохранив память | s = s[:0] |
clear(m) |
for k := range m { delete(m, k) } (неэффективно) |
Очистить и освободить память | s = nil |
m = make(...) |
m = make(...) |