Руководство по началу работы с Go

Эта статья поможет вам начать изучение языка Go. С точки зрения синтаксиса он несложен для изучения — вы сможете начать работать с ним за несколько дней. Однако, следуя традиции, прежде чем официально начать, нам нужно понять его предысторию и происхождение.
Предыстория
Язык Go был создан тремя выдающимися инженерами:
- Ken Thompson, лауреат премии Тьюринга, основатель системы Unix, создатель языка B, создатель языка C
- Rob Pike, один из авторов операционной системы Plan9, один из создателей UTF-8, лидер дизайна языка Go
- Robert Griesemer, разработчик движка JS V8, самый молодой из троих
Также стоит отметить Renee French, жену Rob Pike, которая разработала логотип языка Go — синего суслика.

Однажды три инженера во время долгого ожидания компиляции проекта на C++ почувствовали скуку. Именно в этот момент у Rob Pike возникла новая идея: он хотел создать простой, компактный, быстро компилируемый язык программирования с неплохой производительностью, чтобы им больше не приходилось ждать долгой компиляции каждый раз. После короткого мозгового штурма трое разработчиков 20 сентября 2007 года провели краткую встречу, чтобы обсудить и разработать начальный прототип языка. Именно с этого момента язык Go официально родился. Впоследствии эта небольшая команда привлекла всё больше единомышленников, и наконец 10 ноября 2009 года компания Google официально открыла исходный код языка Go под лицензией BSD-3-Clause, выпустив первую предварительную версию и сформировав официальную команду разработки.
Примечание
Стоит отметить, что вы можете встретить название Golang в других местах, включая репозиторий Github этого сайта, который называется Golang-Doc. Однако его официальное название всегда было Go. В ранние времена доменное имя go было занято, поэтому официальный сайт использовал домен golang.org, из-за чего новички ошибочно полагали, что язык называется Golang.

Позже, после трёх лет проектирования и разработки, команда Go выпустила первую официальную версию Go 1.0 в марте 2012 года (в то время инструментарий и среда выполнения Go всё ещё были написаны на C, и только в Go 1.5 была завершена самостоятельная компиляция). После этого ежегодно выходило по два минорных обновления, и так продолжается до сих пор.
Трое основателей фактически отошли от дел довольно давно. Большую часть времени лидером команды был Russ Cox, который участвовал в разработке ещё до публичного релиза Go и руководил командой Go в течение 12 лет, пока в августе 2024 года не передал полномочия Austin Clements, который теперь ведёт последующую разработку.
Если вы хотите глубже погрузиться в историю языка Go, посетите Go History для получения дополнительной информации.
Особенности
- Простой синтаксис Go сделал выбор в пользу ограничения свободы и гибкости ради лучшей поддерживаемости и плавной кривой обучения.
- Дружелюбное развёртывание Статически скомпилированные двоичные файлы Go не требуют дополнительной среды выполнения, а скорость компиляции очень высока.
- Кросс-компиляция Go позволяет компилировать программы для других платформ, просто установив два параметра при компиляции.
- Нативная конкурентность Поддержка конкурентности в Go является встроенной — достаточно одного ключевого слова, чтобы запустить асинхронную сопрограмму.
- Сборка мусора Go имеет отличную производительность GC — в большинстве случаев задержка GC не превышает 1 миллисекунды.
- Богатая стандартная библиотека От обработки строк до парсинга AST исходного кода — мощная и богатая стандартная библиотека является прочной основой языка Go.
- Полный инструментарий Go имеет развитую цепочку инструментов разработки, охватывающую компиляцию, тестирование, управление зависимостями, профилирование и многое другое.
Язык Go отказался от наследования, ослабил OOP, классы, метапрограммирование, дженерики, лямбда-выражения и другие подобные функции. Он обладает хорошей производительностью и низким порогом входа, подходит для разработки облачных сервисов, серверных приложений и сетевого программирования. Он имеет встроенный GC, поэтому разработчикам не нужно вручную управлять памятью. Статическая и кросс-компиляция также очень удобны для администраторов.
У языка Go также немало недостатков, таких как критикуемая обработка ошибок, неполные дженерики, богатая стандартная библиотека, но мало встроенных структур данных, повсеместное использование типа interface{}, отсутствие типа перечисления. Кроме того, команда разработки Go довольно консервативна и неохотно прислушивается к мнению сообщества. (Для сравнения, Rust справляется с обработкой ошибок, дженериками, управлением зависимостями, перечислениями и интерфейсами намного лучше.)
В целом, нам нужно диалектически подходить к языку. Как инженерный язык, Go может значительно повысить нижнюю планку команды — даже разработчики с невысоким уровнем могут работать, и редко когда один человек портит весь проект. Благодаря простому синтаксису и низкому порогу обучения можно быстро приступить к проекту. Хотя Go существует немногим более десяти лет, уже немало компаний выбрали его как основной язык, что косвенно свидетельствует о растущей популярности Go.
Кстати, Go — это полностью открытый язык, развитие которого поддерживается сообществом и Google. Официальный адрес находится в репозитории Google, на Github есть зеркальная копия. При желании вы тоже можете участвовать в дизайне языка.
Официальный сайт: The Go Programming Language
Репозиторий Google: google/go: Google Open Source
Репозиторий Github: golang/go: The Go programming language
TIP
Автор ранее отправлял PR в Go. Если вы хотите узнать, как внести свой вклад в код Go, можете прочитать эту статью: Как внести вклад в Go.
Многие, вероятно, слышали о Rust — высокопроизводительном языке программирования общего назначения. Он появился на год раньше Go. Официальная версия Go 1 вышла в 2012 году, а официальная версия Rust — в 2015. Оба являются довольно современными языками. Автору нравятся оба, но они развиваются в разных областях. Если вам недостаточно эффективности выполнения и выразительности Go, попробуйте Rust, хотя его кривая обучения намного сложнее, чем у Go.
Установка
Загрузка языка Go: Downloads - The Go Programming Language

Stable Version — это две стабильные версии, которые сейчас находятся на поддержке. Archived Version — это исторические версии, которые больше не поддерживаются. Посетите Журнал изменений для получения дополнительной информации о правилах поддержки и исторических версиях.
Windows
Для платформы Windows доступны два типа: installer и archive. Первый — это установочный пакет, нужно просто нажимать кнопки. Рекомендуется использовать второй вариант, чтобы лучше ознакомиться со структурой каталогов Go, и в будущем при возникновении проблем вы не растеряетесь. Выберите загрузку zip-файла. Архив содержит исходный код Go, инструментарий и документацию. Распакуйте его в указанный путь, затем нужно настроить две переменные среды:
- GOROOT — путь установки Go
- GOPATH — путь хранения зависимостей Go
После настройки добавьте два новых элемента в переменную среды PATH:
%GOROOT%\bin— адрес двоичных файлов Go%GOPATH%\bin— адрес хранения двоичных файлов загружаемых сторонних зависимостей
Выполните команду go version в powershell. Если версия отображается корректно, установка прошла успешно.
PS C:\user\username> go version
go version go1.21.3 windows/amd64Для обновления просто скачайте новый zip-файл и замените оригинальный каталог установки.
Linux
Возьмём Ubuntu в качестве примера. Скопируйте ссылку нужной версии и загрузите её:
$ wget https://golang.google.cn/dl/go1.21.1.linux-amd64.tar.gzРаспакуйте в указанный каталог:
$ tar -C ~/go -xzf go1.21.1.linux-amd64.tar.gzНастройте переменные среды в файле $HOME/.bashrc:
export GOROOT=$HOME/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/binПосле завершения проверьте установленную версию для подтверждения успешной установки:
$ go version
go version go1.21.1 linux/amd64Для обновления просто скачайте новый tar.gz и замените оригинальный каталог установки.
Управление установкой
Указанный выше способ установки достаточен для базового использования. Лично я рекомендую следующую структуру каталогов для хранения Go и связанных файлов:
go/
|
|--root/
| |
| |--go1.21.3/
| |
| |--go1.20.10/
|
|--mod/
| |
| |--bin/
| |
| |--libs/
|
|--cache/
|
|--temp/
|
|--envОписание:
- Каталог
go/rootиспользуется для хранения исходных файлов различных версий Go go/modсоответствуетGOPATHgo/mod/libsсоответствуетGOMODCACHE— адресу хранения загруженных сторонних зависимостейgo/mod/binсоответствуетGOBIN— адресу хранения двоичных файлов сторонних зависимостейgo/cacheсоответствуетGOCACHE— хранит файлы кэшаgo/tempсоответствуетGOTMPDIR— хранит временные файлыgo/envсоответствуетGOENV— файлу конфигурации глобальных переменных среды
При таком подходе для обновления не нужно заменять оригинальный каталог установки — просто поместите новую версию в каталог go/root и измените переменную среды GOROOT на папку нужной версии. По умолчанию файл env читается по пути GOROOT/env. Установив системную переменную GOENV, вы отделите её от GOROOT, что позволяет избежать изменений конфигурации переменных среды Go при смене версии. Ниже приведены начальные настройки файла env:
GO111MODULE=on
GOCACHE=go/cache
GOMODCACHE=go/mod/libs
GOBIN=go/mod/bin
GOTMPDIR=go/tempЭто просто стиль организации каталогов, который нравится автору. Посетите Команды - Переменные среды для получения дополнительной информации о переменных среды — вы можете полностью настроить их по своему усмотрению.
Управление несколькими версиями
Я разработал инструмент управления несколькими версиями govm, который лучше всего работает с указанной выше структурой каталогов. Он может управлять несколькими локальными версиями Go, переключаться между версиями в любое время, а также искать, загружать и устанавливать другие версии Go.
$ govm search 1.22 -n 10
go1.22.6 76 MB
go1.22.5 76 MB
go1.22.4 76 MB
go1.22.3 76 MB
go1.22.2 76 MB
go1.22.1 76 MB
go1.22.0 76 MB
$ govm install 1.22.4
Fetch go1.22.4 from https://dl.google.com/go/go1.22.4.windows-amd64.zip
Downloading go1.22.4.windows-amd64.zip 100% |████████████████████████████████████████| (76/76 MB, 32 MB/s) [2s]
Extract go1.22.4.windows-amd64.zip to local store
Remove archive from cache
Version go1.22.4 installed
$ govm use 1.22.4
Use go1.22.4 now
# Перезапустите shell
$ go version
go version go1.22.4 windows/amd64Если вы хотите узнать, как писать инструменты командной строки на Go, можете использовать govm как референс — он тоже написан на Go.
Редактор
Для языка Go я лично рекомендую только две основные IDE:
- GoLand: продукт JetBrains, мощный, с полной поддержкой, но платный. Можно рассмотреть IDEA Community Edition с плагинами.
- VSCode: бесплатный, универсальный редактор, с плагинами можно писать на любом языке.
Если есть другие редакторы, которые лучше соответствуют вашим привычкам, используйте их. Выбор редактора не так важен. Если нужно написать короткий практический код, попробуйте официальный goplay — можно запускать код Go онлайн.
TIP
Если вы используете JetBrains Toolbox, можете попробовать написанный мной инструмент командной строки AutoToolBox, который может создать контекстное меню Windows для Toolbox.

Напутствие
Язык Go в целом несложен. Если у вас есть опыт работы с другими языками, учиться будет очень просто. При изучении, если столкнётесь с трудными моментами, можно их пропустить и вернуться позже. При изучении любого языка сначала нужно получить общее представление о синтаксисе и структуре, а затем углубляться в особенности и детали. Этот документ следует той же философии и подходит для начинающих. Автор — обычный студент, возможны неточности и ошибки. Если вы обнаружите ошибку, можете отправить PR на Github. Если документ вам понравился, поставьте Star на Github.
Если вы разработчик на языках с сильным OOP, таких как Java или C#, не начинайте с предвзятостью OOP-мышления, иначе многие решения Go покажутся вам странными, и писать код будет неудобно — автор тоже прошёл через это.
Обзор
Ниже представлено краткое описание содержания этого сайта, чтобы вы могли выбирать нужные разделы. Пустые страницы означают, что контент ещё не обновлён.
- Введение в язык: в основном рассказывается о самом языке Go, с упором на теорию.
- Базовый синтаксис: основные синтаксические конструкции, такие как
if,forи т.д. - Продвинутый синтаксис: уникальные возможности Go, модули, тестирование, сопрограммы и т.д.
- Стандартная библиотека: краткое введение в стандартную библиотеку Go. Поскольку она очень обширна, обновления выходят по мере возможности.
- Принципы реализации: внутренние принципы дизайна Go, такие как планирование сопрограмм, управление памятью, сборка мусора и т.д.
- Базовый синтаксис: основные синтаксические конструкции, такие как
- Экосистема сообщества: в основном о周边 экосистеме Go, с упором на практику.
- Базы данных: работа с основными базами данных через Go.
- Микросервисы: инструменты микросервисов, связанные с Go.
- Сторонние библиотеки: сторонние библиотеки, написанные на Go, обновляются по мере возможности. Также можно посмотреть в Навигации по зависимостям.
Перейдите к Началу обучения
