Menu

Что такое Golang? Язык Go простыми словами, с примерами

Go (его часто называют Golang) это статически типизированный компилируемый язык, созданный в Google для быстрых и надёжных серверов и утилит. Здесь разобрано, что это за язык, где его применяют и в чём он уступает другим.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Go это статически типизированный компилируемый язык программирования, созданный в Google. Он собирает программу в один нативный бинарник за секунды, имеет сборщик мусора, а конкурентность встроена прямо в язык через горутины и каналы. Основная область применения: серверный софт, то есть API, сетевые сервисы, а также консольные и облачные инструменты, которые их обслуживают.

Вот полная программа на Go. Нажмите Run.

Любая программа на Go начинается в package main с функции func main(). := объявляет переменную и выводит её тип (здесь []string, слайс строк). range проходит по слайсу и отдаёт индекс и значение. fmt и strings входят в стандартную библиотеку, и она настолько большая, что многим программам больше ничего импортировать не нужно.

Go или Golang: откуда два названия

Язык называется Go. «Golang» это прозвище из адреса первого сайта проекта, golang.org (сейчас сайт живёт на go.dev). Название прижилось, потому что поиск по слову «go» выдаёт что угодно, кроме языка. В официальной документации пишут «Go», но в поисковую строку почти все вводят «golang», и оба слова означают одно и то же. Отдельного продукта или диалекта «Golang» не существует.

Кто создал Go и зачем

Роберт Гриземер, Роб Пайк и Кен Томпсон начали проектировать Go в Google в 2007 году. В ноябре 2009 года язык стал open source, а в марте 2012 года вышел Go 1.0.

Мотивация была практической. Большие кодовые базы Google на C++ и Java долго собирались, графами зависимостей было трудно управлять, а многоядерные машины и сетевые сервисы стали нормой, при этом писать конкурентный код было легко с ошибками. Дизайн Go отвечает на эти проблемы напрямую:

  • Быстрая сборка. Импорты явные, неиспользуемый импорт считается ошибкой компиляции, а компилятор не разбирает заголовочные файлы заново, поэтому большие программы собираются за секунды.
  • Простой язык. Мало ключевых слов, один цикл (for), нет наследования, нет исключений. Код разных людей обычно выглядит похоже, и в большой команде это упрощает ревью.
  • Конкурентность как часть языка. Чтобы запустить конкурентную задачу, достаточно одного ключевого слова, go, а каналы позволяют задачам обмениваться данными.
  • Простой деплой. На выходе один бинарник, который вы копируете на сервер. Обычно он слинкован статически; при включённом cgo пакеты вроде net могут линковаться с системной библиотекой C, и CGO_ENABLED=0 это отключает.

Вместе с Go 1.0 появилось обещание совместимости Go 1: программы, написанные под Go 1.0, продолжают компилироваться и работать на последующих версиях 1.x. На практике обновление тулчейна редко ломает код, и это одна из главных причин, почему команды доверяют Go долгоживущие сервисы.

Для чего используется Golang

Go сильнее всего там, где программа работает с сетью, живёт долго и её нужно просто доставлять на серверы:

ОбластьПримеры
Веб-API и микросервисыHTTP- и gRPC-сервисы, бэкенды веб- и мобильных приложений
Облачные и инфраструктурные инструментыDocker, Kubernetes, Terraform, Prometheus
Консольные утилитыCLI для разработчиков, которые поставляются одним бинарником под каждую платформу
СетиПрокси, балансировщики нагрузки, DNS-серверы
Конвейеры данныхВоркеры, которые читают очереди, преобразуют записи и пишут в базы данных

Go подходит хуже для десктопных GUI-приложений, мобильных приложений, фронтенда в браузере, а также для численных расчётов и машинного обучения: там у других экосистем гораздо лучше библиотеки.

Ключевые возможности на примерах

Статическая типизация с выводом типов

У каждой переменной тип фиксирован на этапе компиляции, но писать его приходится редко. := выводит тип сам:

Go никогда не преобразует числовые типы молча. count * price не скомпилируется, потому что один операнд int, а другой float64; float64(count) вы пишете сами. Это исключает незаметное усечение и ошибки точности.

Ошибки это значения

В Go нет исключений. Функция, которая может завершиться неудачей, возвращает error последним результатом, и вызывающий код его проверяет:

Шаблон if err != nil это самая узнаваемая строка в коде на Go. Он многословен, и в этом весь смысл: каждое место, где программа может упасть, видно там, где это происходит. Как оборачивать и разбирать ошибки, смотрите в разделе обработка ошибок.

Горутины и каналы

Горутина это функция, которая выполняется конкурентно с остальной программой. Её стек занимает несколько килобайт, поэтому тысячи горутин это нормально. Каналы безопасно передают значения между горутинами:

Три горутины работают конкурентно, поэтому три строки могут напечататься в любом порядке. Запустите программу несколько раз, и порядок может меняться. main получает ровно три значения, поэтому дожидается всех трёх, прежде чем завершиться.

Интерфейсы без «implements»

Тип удовлетворяет интерфейсу просто потому, что у него есть нужные методы. Ключевого слова implements нет:

Rect и Circle нигде не упоминают Shape, но оба можно положить в []Shape. Благодаря этому интерфейс можно объявить в пакете, который его использует, спустя долгое время после того, как конкретные типы были написаны.

Один тулчейн

Команда go делает всё: go run компилирует и запускает, go build собирает бинарник, go test запускает тесты, go fmt форматирует код, go vet находит подозрительные конструкции, а go mod управляет зависимостями. Стиль форматирования один, официальный, и его обеспечивает gofmt, поэтому в Go-проектах не спорят о скобках и отступах.

Чего в Go нет намеренно

Некоторых привычных по другим языкам возможностей в Go нет специально:

  • Нет классов и наследования. Вместо них структуры, методы, интерфейсы и встраивание.
  • Нет исключений. Ошибки возвращаются как значения. panic существует, но он для багов, а не для обычных сбоев.
  • Нет тернарного оператора. Пишите if/else.
  • Нет ключевого слова while. for покрывает все виды циклов.
  • Нет перегрузки функций и аргументов по умолчанию.
  • Дженерики появились только в Go 1.18, и они намеренно ограничены по сравнению с шаблонами C++ или дженериками Java.

Честные компромиссы

Многословность. Явные проверки ошибок и отсутствие сокращений вроде тернарного оператора делают код на Go длиннее аналогичного на Python или Kotlin. Читать его легко, но строк получается больше.

Сборка мусора. Сборщик мусора в Go даёт короткие паузы, но это всё равно сборщик мусора. Для систем жёсткого реального времени или кода, где важна каждая аллокация, C, C++ или Rust дают больше контроля.

Значения nil. В Go бывают nil-указатели, мапы, слайсы и интерфейсы. Разыменование nil-указателя приводит к панике во время выполнения, и компилятор не защищает от этого так, как система типов Rust.

Небольшая система типов. Нет типов-сумм, нет перечислений (их собирают из констант и iota), а дженерики покрывают типичные случаи, но не продвинутое программирование на уровне типов.

Пробелы в экосистеме. Библиотеки для веб-сервисов, баз данных и облачных API отличные. Для GUI, научных вычислений и машинного обучения у Python, C++ или Julia выбор гораздо шире.

Go в сравнении с другими языками

GoPythonJavaRust
ТипизацияСтатическаяДинамическаяСтатическаяСтатическая
Как запускаетсяНативный бинарникИнтерпретаторБайткод JVMНативный бинарник
ПамятьСборщик мусораСборщик мусораСборщик мусораВладение, без GC
КонкурентностьГорутины, каналыПотоки, asyncio (GIL ограничивает параллелизм на CPU)Потоки, виртуальные потокиПотоки, async
Порог входаНизкийНизкийСреднийВысокий

Выбирайте Go, когда нужна производительность компилируемого языка и простой деплой без крутого порога входа Rust и церемоний Java.

Стоит ли учить Go?

Если вы пишете бэкенд-сервисы, консольные утилиты или что-то из области облачной инфраструктуры, то да. Значительная часть этой экосистемы написана на Go, и чтение её исходников входит в работу. Язык маленький, поэтому вложения скромные: базовый синтаксис осваивается за несколько дней, а идиоматичная конкурентность и обработка ошибок требуют нескольких недель практики.

Чтобы писать на Go у себя на компьютере, установите Go, а затем пройдите страницу hello world: там разобрана каждая строка первой программы.

Часто задаваемые вопросы

Для чего используется Golang?

В основном для бэкенда и инфраструктуры: веб-серверы и API, микросервисы, консольные утилиты, сетевой код и облачные инструменты. Docker, Kubernetes, Terraform и Prometheus написаны на Go. Для десктопных GUI, мобильных приложений и data science его используют редко.

Go и Golang это одно и то же?

Да. Язык называется Go. Слово «Golang» пришло из адреса первого сайта, golang.org, и прижилось, потому что слово «go» плохо ищется. Оба названия означают один и тот же язык и один и тот же тулчейн.

Кто создал язык программирования Go?

Роберт Гриземер, Роб Пайк и Кен Томпсон начали проектировать Go в Google в 2007 году. В ноябре 2009 года язык открыли как open source, а в марте 2012 года вышел Go 1.0, с которого началось обещание совместимости Go.

Сложно ли выучить Go?

Сам язык маленький: 25 ключевых слов, одна конструкция цикла и короткая спецификация, которую можно прочитать за вечер. Большинство программистов с опытом в другом языке пишут рабочий код на Go уже через несколько дней. Дольше осваиваются идиомы: явная обработка ошибок, интерфейсы и корректный конкурентный код на горутинах и каналах.

Go компилируемый или интерпретируемый язык?

Компилируемый. go build создаёт нативный бинарник в машинном коде, которому не нужны интерпретатор или виртуальная машина. go run тоже компилирует: он просто собирает программу во временную папку и запускает результат.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ