Перейти к содержимому

Поиск доступен только в продакшен-сборках. Выполните сборку и запустите превью, чтобы протестировать поиск локально.

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Публичный анонс
2012Go 1.0 — стабильный API, обещание обратной совместимости
2015Go 1.5 — полностью переписан на Go (раньше был на C)
2022Go 1.18 — добавлены дженерики
2024Go 1.22+ — range over int, улучшенные итераторы

Обратная совместимость — важная штука. Код, написанный в 2012 году под Go 1.0, скомпилируется и сегодня. Не все языки могут таким похвастаться.


Чем отличается от других языков

Go vs Python

Python — интерпретируемый, Go — компилируемый. Разница в скорости — в десятки раз.

Тот же алгоритм:
Python: 47 секунд
Go: 1.2 секунды

Но Python проще для старта, больше библиотек для ML/DS, легче прототипировать. Go берут когда нужна производительность или когда проект вырастает и Python начинает тормозить.

PythonGo
ТипизацияДинамическаяСтатическая
СкоростьМедленныйБыстрый
КомпиляцияНет (интерпретатор)Да (бинарник)
КонкурентностьGIL, asyncioГорутины
СтартПрощеЧуть сложнее

Go vs Java

Оба компилируемые, статически типизированные. Но:

  • Go компилируется в нативный бинарник, Java — в байткод для JVM
  • В Go нет классов, наследования, исключений (и это намеренно)
  • Go-бинарник — один файл без зависимостей. Java тащит за собой JVM
  • Меньше бойлерплейта: нет геттеров/сеттеров, аннотаций, XML-конфигов
// Java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
// Go
package 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 и напишем первую программу.


Источники