What is Go?
Golang или как его называют сокращённо Go — язык программирования.
Язык программирования — способ давать компьютеру инструкции. Компьютер не понимает человеческий язык, а мы не понимаем машинный код из нулей и единиц. Язык программирования — посередине: пишем текст по определённым правилам, специальная программа переводит его в то, что понимает компьютер.
Программа — текстовый файл с этими инструкциями. Всё начинается с текстового файла. Вы открываете редактор, пишете инструкции по правилам языка, сохраняете. Затем запускаете — и компьютер выполняет написанное, строка за строкой.
Языков программирования сотни: Python, JavaScript, Java, C++, Rust и другие. Каждый со своими правилами и областью применения. Go — один из них.
Откуда взялся
В 2007 году трое инженеров Google — Роб Пайк, Кен Томпсон и Роберт Гризмер — устали ждать. Буквально. Компиляция C++ проектов в Google занимала десятки минут. Зависимости превращались в ад. Код на Java требовал тонны бойлерплейта. Python был медленным.
Они решили сделать свой язык. С нуля. С тремя целями:
- Быстрая компиляция — секунды, не минуты
- Простой синтаксис — меньше способов сделать одно и то же
- Многозадачность — программа может делать несколько дел сразу, а не по очереди. Как повар, который пока варится суп, режет салат, а не стоит и ждёт
Кен Томпсон, кстати, тот самый — один из создателей Unix и языка C. Роб Пайк работал над Plan 9 и UTF-8. Не случайные люди.
Ключевые даты
| Год | Событие |
|---|---|
| 2007 | Начало разработки |
| 2009 | Публичный анонс |
| 2012 | Go 1.0 — стабильный API, обещание обратной совместимости |
| 2015 | Go 1.5 — полностью переписан на Go (раньше был на C) |
| 2022 | Go 1.18 — добавлены дженерики |
| 2024 | Go 1.22+ — range over int, улучшенные итераторы |
Обратная совместимость — важная штука. Код, написанный в 2012 году под Go 1.0, скомпилируется и сегодня. Не все языки могут таким похвастаться.
Чем отличается от других языков
Go vs Python
Python — интерпретируемый, Go — компилируемый. Разница в скорости — в десятки раз.
Тот же алгоритм:Python: 47 секундGo: 1.2 секундыНо Python проще для старта, больше библиотек для ML/DS, легче прототипировать. Go берут когда нужна производительность или когда проект вырастает и Python начинает тормозить.
| Python | Go | |
|---|---|---|
| Типизация | Динамическая | Статическая |
| Скорость | Медленный | Быстрый |
| Компиляция | Нет (интерпретатор) | Да (бинарник) |
| Конкурентность | GIL, asyncio | Горутины |
| Старт | Проще | Чуть сложнее |
Go vs Java
Оба компилируемые, статически типизированные. Но:
- Go компилируется в нативный бинарник, Java — в байткод для JVM
- В Go нет классов, наследования, исключений (и это намеренно)
- Go-бинарник — один файл без зависимостей. Java тащит за собой JVM
- Меньше бойлерплейта: нет геттеров/сеттеров, аннотаций, XML-конфигов
// Javapublic class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); }}// Gopackage main
import "fmt"
func main() { fmt.Println("Hello, World!")}Примерно одинаково, но в реальных проектах разница ощутимее — Java-проекты обрастают абстракциями, Go остаётся простым.
Go vs C/C++
Go создавался как “C для 21 века”:
- Сборка мусора — не надо руками управлять памятью
- Нет указательной арифметики (ну почти, есть
unsafe, но это отдельная история) - Компиляция быстрее на порядки
- Встроенные строки, слайсы, мапы
Платишь за это небольшой потерей производительности. Для большинства задач — незаметно. Для системного программирования уровня ядра — Go не подойдёт, там по-прежнему C/C++ или Rust.
Go vs Rust
Rust — про максимальный контроль и безопасность памяти без сборщика мусора. Круто, но сложно. Кривая обучения — стена.
Go — про продуктивность. За неделю можно писать рабочий код. Rust за неделю — разбираться с borrow checker.
Для веб-сервисов, API, CLI — обычно Go. Для системщины, embedded, где важна каждая микросекунда — Rust.
Где используется
Инфраструктура и облака
Docker, Kubernetes, Terraform, Prometheus, Grafana, etcd, CockroachDB — всё это на Go.
Почему: один бинарник без зависимостей легко деплоить. Горутины хорошо ложатся на сетевые сервисы. Кросс-компиляция — собрал под Linux на маке одной командой.
Бэкенд
Uber, Twitch, Dropbox, SoundCloud, Dailymotion — используют Go для высоконагруженных сервисов.
Типичные кейсы:
- API-сервисы
- Микросервисы
- Очереди сообщений
- Прокси и load balancer’ы
CLI-утилиты
GitHub CLI, Hugo (генератор статических сайтов), lazygit, fzf — написаны на Go.
Один бинарник, работает везде, быстро запускается. Для CLI — идеально.
Блокчейн
Ethereum-клиент Geth, Hyperledger Fabric — на Go. Криптопроекты любят Go за производительность и простоту аудита кода.
Философия языка
Go — намеренно простой. Это не баг, а фича.
Один способ сделать что-то. В Python можно написать list comprehension, map/filter, цикл for — три способа для одного результата. В Go — обычно один очевидный способ.
Явное лучше неявного. Нет магических методов, нет неявных преобразований типов, нет скрытого поведения.
Меньше — лучше. В языке 25 ключевых слов (в C++ — больше 90). Нет наследования, нет исключений, нет перегрузки функций. Звучит как ограничение, на практике — меньше когнитивной нагрузки.
Код читают чаще, чем пишут. Go оптимизирован для чтения. Скучный, предсказуемый, одинаковый везде. Открываешь чужой проект — и сразу понимаешь что происходит.
Что хорошо
- Скорость — компилируемый, нативный код
- Простота — выучить базу можно за выходные
- Конкурентность — горутины и каналы из коробки
- Тулинг — форматирование, тесты, бенчмарки, профилирование встроены
- Один бинарник — никаких runtime-зависимостей
- Кросс-компиляция — собрать под любую платформу одной командой
- Обратная совместимость — код не ломается при обновлении версии
Что плохо
Язык не идеальный, и это нормально.
- Многословность — нет дженерик-функций для map/filter/reduce (точнее есть с 1.18, но экосистема ещё не перестроилась)
- Обработка ошибок —
if err != nilна каждом шагу, бесит поначалу - Нет исключений — кому-то минус, кому-то плюс
- GUI — не для десктопных приложений, библиотеки сырые
- Не для ML/DS — экосистема несравнима с Python
Для кого этот язык
Go подойдёт если вы:
- Пишете бэкенд, API, микросервисы
- Делаете CLI-утилиты
- Работаете с высокими нагрузками
- Хотите простой язык без магии
- Цените быструю компиляцию и хороший тулинг
Go не подойдёт если вы:
- Занимаетесь ML/DS — берите Python
- Пишете мобильные приложения — Swift/Kotlin
- Делаете фронтенд — JavaScript/TypeScript
- Хотите максимум производительности и контроля — Rust/C++
Итого
Go — это:
- Язык от Google, создан в 2007, релиз в 2009
- Компилируемый, статически типизированный, со сборкой мусора
- Простой синтаксис, встроенная конкурентность
- Для бэкенда, CLI, инфраструктурных инструментов
- Docker, Kubernetes, Terraform — на нём
В следующих уроках установим Go и напишем первую программу.
Источники
- Go at Google: Language Design in the Service of Software Engineering — Роб Пайк о причинах создания Go
- Go FAQ — официальные ответы на частые вопросы
- Wikipedia: Go (programming language)
- The Go Blog
- TIOBE Index — рейтинг языков программирования