Пара мыслей про поиск мёртвого кода в Go, в порядке бреда



В Go 1.20 сделали возможность сбилдить приложение с флагом cover





go build -cover






после чего, если запустить такое приложение, то будет собираться статистика, какие части приложения были выполнены, а какие нет, и складываться в папочку, указанную в переменной окружения.



Это, конечно, было сделано для хитрых интеграционных тестов, когда приложение запускается целиком в каких-то сценариях (а не через go test), но возможно это можно попробовать использовать и по-другому:



запустить прям на проде, подержать какое-то время и посмотреть, какие участки кода в реальности никогда не запускаются.



Это бывает нужно, когда в проекте есть старый легаси-код, и никто уже не знает, что там и зачем. Часто часть этого кода - просто старое недовыпиленное говно. И наоборот - кажется, что код уже не нужен, а он нет-нет, но иногда работает.



Правда, сбор статистики наверняка вносит некоторое торможение в код, насколько много - хз, я пока что не пробовал (У меня сейчас довольно простые микросервисы, там мало кода, и нет старого непонятного легаси). Так что это точно не всем подойдёт.



Просто как мысль на подумать



Пара деталей:



Запускать надо с переменной окружения GOCOVERDIR



GOCOVERDIR=somedata ./myapp 




После завершения приложения в этой папке появятся бинарники, которые можно сконвертировать в нормальный вид



go tool covdata textfmt -i=somedata -o coverage.txt




и посмотреть, что там, стандартными средствами, например так:



go tool cover -html=coverage.txt




Кстати, если приложение было внезапно принудительно завершено, например из-за паники, то статистика не соберется