Один из самых недооценённых факторов перехода с .NET на Go — это инструментарий. В мире .NET вы привыкли к мощной IDE (Visual Studio / Rider), к интегрированному отладчику в один клик, к NuGet, к коммерческим профайлерам мирового класса (dotTrace, dotMemory) и к PerfView. Многое из этого — отдельные продукты, нередко платные, живущие вокруг рантайма.
Go исповедует другую философию: бо́льшая часть тулинга — часть самого языка и поставляется в одном бинарнике go. Сборка, тесты, форматирование, статический анализ, управление зависимостями, профилирование, трассировка — всё это подкоманды go или пакеты стандартной библиотеки. Профайлер (pprof) встроен в рантайм настолько глубоко, что вы можете профилировать прод прямо через HTTP-эндпоинт без пересборки и без сторонних агентов. Отладчик (dlv) — заметное исключение: он не входит в дистрибутив, но это единственный стандарт де-факто, который понимает горутины и рантайм Go.
Этот раздел — практический. Мы разберём три кита повседневной работы: управление зависимостями и инструментами, отладку через Delve и профилирование через pprof (с акцентом на последнем — это суперсила Go), а в финале сведём всё в таблицу соответствий с .NET-миром.
- Чётко разделять
go get(управление зависимостями модуля) иgo install(установка исполняемых инструментов), перестав их путать. - Устанавливать инструменты как зависимости проекта: исторический паттерн
tools.goи современная директиваtoolвgo.mod(Go 1.24) с командойgo tool. - Понимать роль
GOPATH/GOBIN/модульного кэша и местоgo mod tidy,go vet,go fmtв едином тулчейне. - Отлаживать Go-код через Delve (
dlv debug/test/attach, инспекция горутин, удалённая headless-отладка для контейнеров) и понимать, почему стандарт — не gdb. - Профилировать приложения через pprof: программно (
runtime/pprof) и по HTTP (net/http/pprof), читать профили CPU/heap/goroutine/block/mutex, строить flame graphs, искать утечки и горячие места. - Профилировать бенчмарки (
go test -bench -cpuprofile -memprofile -benchmem) и знать проgo tool trace. - Сопоставлять весь инструментарий Go с экосистемой .NET (CLI, профайлеры, отладчик, форматтеры/анализаторы).
- Управление пакетами и инструментами —
go getvsgo install, директиваtoolвgo.mod(Go 1.24) противtools.go,GOPATH/GOBIN/кэш,go mod tidy/vet/fmt. - Отладка: Delve — почему
dlv, а не gdb;dlv debug/test/attach, инспекция горутин, headless-режим для контейнеров, интеграция с VS Code и GoLand. - Профилирование: pprof — встроенный профайлер:
runtime/pprofиnet/http/pprof, виды профилей, рабочий процессgo tool pprof, flame graphs, бенчмарки с профилированием,go tool trace. - Сравнение с .NET — единый CLI обоих миров, встроенный pprof против внешних профайлеров, отдельный Delve против интегрированного отладчика VS, сводная таблица инструментов.
Держите таблицу под рукой при чтении раздела. Детали каждого сопоставления разбираются в соответствующих главах.
| Задача / инструмент в .NET | Аналог в Go | Ключевое различие |
|---|---|---|
dotnet add package (NuGet) |
go get pkg@version |
Правит go.mod/go.sum; нет отдельного .csproj с <PackageReference> |
dotnet tool install -g |
go install pkg@version |
Ставит бинарник в $GOBIN, не трогает зависимости проекта |
dotnet tool install (local) + dotnet-tools.json |
директива tool в go.mod + go tool (Go 1.24) |
Инструменты как зависимости проекта, версионируются вместе с кодом |
dotnet build / run / test / publish |
go build / run / test / install |
Единый тулчейн в обоих мирах, но Go компилирует в один статический бинарник |
dotnet format |
gofmt / go fmt |
В Go форматирование каноничное и неконфигурируемое — стиль один на всех |
Roslyn-анализаторы / dotnet format analyzers |
go vet + staticcheck |
go vet встроен; staticcheck — стандарт сообщества |
Отладчик Visual Studio / vsdbg |
Delve (dlv) |
В Go отладчик — отдельный CLI-инструмент, а не часть IDE/рантайма |
| dotTrace / VS Profiler (CPU) | pprof (CPU-профиль) |
Встроен в рантайм; профилирует прод через HTTP |
| dotMemory (память/аллокации) | pprof (heap/allocs) |
Встроен; снимок кучи без отдельного агента |
dotnet-trace / PerfView (события, трассировка) |
go tool trace |
Трассировщик планировщика/горутин в составе тулчейна |
dotnet-counters / EventCounters |
эндпоинты net/http/pprof + метрики |
В Go диагностика по умолчанию идёт через HTTP-эндпоинты |
| BenchmarkDotNet | go test -bench (+ -benchmem, -cpuprofile) |
Бенчмарки — часть go test, не отдельная библиотека |