В го автоматическое управление памятью, поэтому утечек памяти в классическом смысле быть не может (если не использовать пакет unsafe). Но могут быть утечки горутин (когда вы запускаете горутины, но они не завершаются, а блокируются на каком-то io или мьютексе/канале/...)
Такое легко ищется с помощью pprof. Добавьте в свою программу веб-интерфейс pprof-а
Для этого запустите любой http-сервер из стандартной библиотеки и добавьте импорт
import _ "net/http/pprof"
Например так:
import (
"net/http"
_ "net/http/pprof"
)
...
func main() {
...
http.ListenAndServe("localhost:8080", nil)
}
После этого при запуске программы у вас должен открываться веб-интерфейс pprof-а по адресу
127.0.0.1:8080/debug/pprof
Дождитесь, когда накопятся утечки и откройте страницу
127.0.0.1:8080/debug/pprof/goroutine?debug=1
На ней будет список всех работающих горутин и их количество. Найдите группу с самым большим количеством, она и утекает. По стеку посмотрите, где горутина блокируется, тогда поймете, почему они накапливаются.