Переход с богатого абстракциями C# на спартанский Go — это не просто изучение нового синтаксиса. Это фундаментальный сдвиг в инженерном мышлении. Здесь мы отказываемся от «магии» фреймворков, тяжелых ORM и скрытых аллокаций ради предсказуемости, скорости и полного контроля.
Этот репозиторий — структурированный справочник для .NET-инженеров, которые хотят перенести свой Enterprise-опыт в мир Go, четко понимая разницу архитектур и внутреннее устройство языка.
- Спартанский подход: 25 ключевых слов и встроенные функции (
builtin). - Семантика значений: почему в Go нет деления на value/reference типы и всё копируется по значению.
- Коллекции: массивы, слайсы, мапы. Реализация стека, очереди и
HashSet. - Слайсы под капотом: длина (
len), вместимость (cap), аллокации. - Сравнение с .NET: Богатый синтаксис C# против минимализма Go. Жизнь без LINQ.
List<T>иDictionary<K,V>против встроенных срезов и мап.
Главы: Спартанский подход: ключевые слова и builtin · Семантика значений · Коллекции · Слайсы под капотом · Сравнение с .NET
- Стек vs Куча: как работает Escape Analysis.
- Указатели (
*и&): передача по значению против передачи по ссылке. - Отсутствие NRE:
nil pointer dereferenceи работа методов сnil-указателями. - Интерфейсы и Duck Typing: неявная реализация контрактов.
- Пустой интерфейс (
any), проблема Боксинга и как спасают Дженерики (Go 1.18+). - Сравнение с .NET:
struct/classв C# против Escape Analysis. Generational GC (Stop-The-World) против Concurrent Mark and Sweep (Low Latency). Упаковка типов.
Главы: Стек vs Куча и Escape Analysis · Указатели · Нулевые значения и методы на nil · Интерфейсы и Duck Typing · any, Боксинг и Дженерики · GC в Go и сравнение с .NET
- Горутины vs Потоки ОС: планировщик M:P:G, вес стека.
- Каналы (
chan): буферизованные/небуферизованные, Producer-Consumer. - Управление потоком:
select, таймауты и отмена черезcontext.Context. - Синхронизация:
sync.Mutexиsync.WaitGroup. Проблема Goroutine Leaks. - Сравнение с .NET:
async/awaitиTaskпротив горутин. TPL Dataflow противchan.lock()противsync.Mutex.
Главы: Горутины и планировщик GMP · Каналы · select и context · Синхронизация и утечки · Жизненный цикл и закрытие ресурсов · Сравнение с .NET
- Миф об «официальном стандарте» и реальный Community Layout:
cmd/,internal/,pkg/. - Системы пакетов: экспорт через заглавную букву.
- Управление зависимостями:
go.modиgo.sum. Запрет на циклические импорты (Cyclic Imports). - Сравнение с .NET: Жизнь без
.slnи.csproj. Модификаторы доступа (public/private) против регистра букв. NuGet противgo get.
Главы: Модули и пакеты · Структура проекта · Пакеты и видимость · Зависимости и go-модули · Воркспейсы (go.work) · Сравнение с .NET
- Инверсия контроля (IoC): ручной DI (Composition Root).
- Конфигурации: философия
env. Библиотеки:cleanenv,viper,caarlos0/env. - Тэги структур (
Struct Tags), рефлексия и Валидация (validator). - Сравнение с .NET:
IServiceCollectionпротив ручной сборки.IConfigurationпротив переменных окружения.
Главы: Внедрение зависимостей (DI) · Конфигурация · Тэги, рефлексия, валидация · Сравнение с .NET
- JSON (
encoding/json): тэги,omitempty,null-значения, интерфейсы сериализации. - YAML (
gopkg.in/yaml.v3): парсинг сложных конфигураций. - Бинарная сериализация: стандартный
encoding/gobvs Protobuf. - Сравнение с .NET:
System.Text.Jsonпротивencoding/json(разница в производительности).
Главы: JSON · YAML · Бинарные форматы: gob и Protobuf · Сравнение с .NET
- Почему Go выбирает генерацию (Compile-time) вместо магии рефлексии (Runtime).
- Директива
//go:generate. Инструменты:stringer,mockery,protoc. - Сравнение с .NET: Source Generators и Reflection Emit против генерации текста в Go.
Главы: Генерация vs рефлексия · go:generate и инструменты · Сравнение с .NET
- HTTP-сервер (
net/http) из коробки: встроенный роутинг. - gRPC и Protobuf: написание контрактов, Client-side балансировка (Round Robin), mTLS.
- Шаринг контрактов в монорепозитории и через инструмент Buf.
- Сравнение с .NET: ASP.NET Core Controllers против
http.Handler. Встроенный gRPC противprotoc/Buf.
Главы: HTTP-сервер (net/http) · gRPC и Protobuf · Шаринг контрактов и Buf · Сравнение с .NET
- Ретраи (Retries): встроенные циклы vs
avast/retry-go(Exponential Backoff, Jitter). - Circuit Breaker: паттерн предохранителя и
sony/gobreaker. - Rate Limiter: встроенный
golang.org/x/time/rateи Token Bucket. - Сравнение с .NET: Экосистема Polly против модульного подхода в Go.
Главы: Ретраи · Circuit Breaker · Rate Limiting · Сравнение с .NET
- Реляционные БД:
database/sql, Connection Pool. sqlx: избавление от рутины через тэгиdb.- Redis (
go-redis) и паттерн Cache-Aside. - Сравнение с .NET: EF Core и Dapper против голого SQL и
sqlx. Управление пулом (ADO.NET vssql.DB).
Главы: database/sql и пул соединений · sqlx · Redis и Cache-Aside · Сравнение с .NET
- Паттерн Декоратор: перехват запросов (HTTP, gRPC, БД).
- Логирование: эволюция от
zapк встроенномуlog/slog. - Метрики: Prometheus из коробки (Pull-модель,
/metrics). - Трейсинг: OpenTelemetry, прокидывание
TraceID. - Сравнение с .NET: ASP.NET Pipeline против Декораторов. Serilog против
slog.Activityпротивspan.
Главы: Middleware и декораторы · Логирование: slog · Метрики: Prometheus · Трейсинг: OpenTelemetry · Сравнение с .NET
- Эффективный Docker-образ: Multi-stage сборка, сталинковка бинарников, образы
alpineиscratch(15 МБ). - Игнор-файлы: что класть в
.gitignoreи.dockerignore. - Сравнение с .NET: ASP.NET Runtime Images против бинарника без ОС. JIT против AOT.
Главы: Эффективный Docker-образ · Игнор-файлы · Сравнение с .NET
- Пакетный менеджер:
go getvsgo install. - Отладка: стандарт Delve (
dlv). - Профилирование (
pprof): поиск утечек памяти и CPU flame graphs на проде. - Сравнение с .NET: .NET CLI против Go CLI. Visual Studio Profiler/dotTrace против
pprof.
Главы: Управление пакетами и инструментами · Отладка: Delve · Профилирование: pprof · Сравнение с .NET
- Философия ошибок:
if err != nil,fmt.Errorf,errors.Is/errors.As. - Тестирование: встроенный
testing. Table-driven tests. - Моки (Mockery) и Testcontainers.
- Сравнение с .NET: Исключения (
try/catch/finally) против возврата значений. xUnit/Moq противtestingи кодогенерации моков.
Главы: Обработка ошибок · defer, panic и recover · Тестирование · Моки и Testcontainers · Сравнение с .NET
- Общая основа тулчейна:
gopls(язык-сервер),dlv(Delve),golangci-lint,gofumpt. - VS Code (основной упор): расширение
golang.go, полезныеsettings.json, отдельный профиль, отладка черезlaunch.json— включая удалённую в Docker. - Zed:
gopls, настройки, DAP-отладка через Delve.
Главы: VS Code для Go · Zed для Go
Материалы будут дополняться. Если вы нашли ошибку или хотите дополнить руководство — Pull Requests приветствуются!
