Skip to content

vkrishtal91/csharp-to-go

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

От .NET к Go — Путеводитель для C#-разработчика

От .NET к Go: Путеводитель для C#-разработчика

Переход с богатого абстракциями 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/gob vs 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 vs sql.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 get vs go 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 приветствуются!

About

Путеводитель и руководство по выживанию для .NET/C# разработчиков, переходящих на Go.

Topics

Resources

License

Stars

5 stars

Watchers

0 watching

Forks

Contributors