Ответ
Да, утечки памяти возможны даже в Go, несмотря на сборщик мусора (GC). Основные причины:
- Глобальные переменные – объекты в них никогда не удаляются:
var cache = make(map[string]interface{}) // Утечка, если map растёт бесконтрольно
- Горутины – зависшие горутины удерживают ссылки:
go func() {
for { /* бесконечный цикл */ }
}() // Утечка, если горутина не завершается
- Срезы – удержание ссылки на базовый массив:
bigData := make([]byte, 1<<30) // 1GB
smallSlice := bigData[:10] // Удерживает весь 1GB массив
- CGO – ручное управление памятью через C-код.
Для диагностики используйте pprof и runtime.ReadMemStats.