Go
Go (Golang) — простой и быстрый язык для серверов и утилит. Курс с нуля: установка, типы, срезы, map, функции и ошибки, структуры и интерфейсы, горутины, модули.
Go (часто говорят Golang — по старому адресу сайта golang.org) — язык программирования, который создали в Google Роберт Гризмер, Роб Пайк и Кен Томпсон. Язык представили в 2009 году, версия 1.0 вышла в 2012-м. Go бесплатен, его исходный код открыт, программы на нём работают в Windows, macOS и Linux.
Go задуман простым: в нём мало служебных слов, один вид цикла, нет классов и наследования. Программа компилируется в машинный код — в один исполняемый файл, которому на компьютере, где он запускается, обычно не нужны ни интерпретатор, ни дополнительные библиотеки. Компилятор работает быстро, и готовые программы тоже.
Где применяется
- Серверная часть сайтов и приложений. API (набор запросов, через которые одна программа обращается к другой), микросервисы (небольшие отдельные программы, из которых складывается большая система), обработка очередей — главная область Go. В стандартной библиотеке уже есть HTTP-сервер, работа с JSON и шифрование.
- Инфраструктура и DevOps (сборка, выкладка и обслуживание программ на серверах). На Go написаны Docker, Kubernetes, Terraform, Prometheus — инструменты, на которых держится работа многих серверов.
- Утилиты командной строки. Один файл без зависимостей легко раздать коллегам или положить на сервер.
- Сетевые программы. Горутины — лёгкие потоки Go — позволяют держать тысячи соединений одновременно без сложного кода.
Что нужно для начала
- компьютер с Windows 10 или 11, macOS или Linux;
- Go 1.22 или новее с официального сайта go.dev — как его поставить, рассказано в первом уроке;
- редактор: удобнее всего VS Code с расширением Go — оно подсвечивает ошибки и само выравнивает код;
- опыт в любом другом языке поможет, но не обязателен: каждое понятие объясняется при первом появлении.
Новые версии Go выходят два раза в год — в феврале и в августе. Создатели языка обещают совместимость для всей ветки Go 1: программа, написанная для старой версии, собирается и в новой. Курс опирается на Go 1.22 — в этой версии появился цикл for i := range 10 и изменились правила переменных цикла, поэтому в старых версиях часть примеров поведёт себя иначе.
Как пройти курс
Уроки идут по порядку: установка и первая программа, переменные и типы, ввод и вывод, условия и циклы, срезы, map, функции и ошибки, структуры и интерфейсы, горутины и каналы, пакеты и модули. Почти все программы в уроках целые: их можно скопировать в файл main.go и запустить командой go run ., а под программой показано, что она выведет. Если программа читает ввод с клавиатуры, то, что нужно набрать, показано отдельным блоком.
В Go строгий компилятор: неиспользуемая переменная или лишний import — ошибка, а не предупреждение. Поначалу это раздражает, но сообщения компилятора короткие и точные, а частые из них разобраны в справочнике. После каждого урока — несколько вопросов для проверки, в конце курса — итоговый тест.
Тем, кто пишет на Python, Go покажется многословнее, зато ошибки типов он ловит ещё до запуска. Связанные темы — Python, Docker (программы на Go часто запускают в контейнерах) и Bash.
Курс с нуля
- 1.Установка Go и первая программаКак установить Go, создать модуль командой go mod init, написать первую программу с package main и fmt.Println, запустить её через go run и собрать go build.
- 2.Переменные, := и типыКак объявить переменную в Go через var и :=, какие бывают типы (int, float64, string, bool, rune), нулевые значения, константы, преобразование типов и деление целых.
- 3.Ввод и вывод — fmt.Scan, bufio и PrintfКак прочитать числа и строки с клавиатуры в Go (fmt.Scan, bufio.Scanner), как выводить через fmt.Printf с форматом %d, %s, %.2f, %v, и как ускорить ввод-вывод для больших данных.
- 4.Условия, switch и цикл forКак в Go писать if и else, switch без break, условие с коротким объявлением, и как устроен единственный цикл for — классический, «пока», бесконечный и range, с break, continue и метками.
- 5.Массивы, срезы и appendЧем массив в Go отличается от среза, как создать срез литералом и через make, добавить элементы через append, взять часть среза, скопировать через copy и обойти range.
- 6.Map — словари в GoКак создать map в Go литералом и через make, добавить, прочитать и удалить значение, проверить ключ через v, ok, обойти map по порядку ключей и посчитать слова в тексте.
- 7.Функции, несколько значений и ошибкиКак объявить функцию в Go, вернуть несколько значений, передать переменное число аргументов, и как устроены ошибки — тип error, errors.New, fmt.Errorf с %w и проверка if err != nil.
- 8.Структуры, методы и интерфейсыКак в Go описать свой тип через struct, написать методы с приёмником-значением и приёмником-указателем, что такое указатель, и как интерфейсы заменяют классы и наследование.
- 9.Горутины и каналыКак запустить код параллельно в Go: горутины и go, ожидание через sync.WaitGroup, передача данных по каналам, close и range, буферизованные каналы, гонки данных и sync.Mutex.
- 10.Пакеты и модулиКак разложить программу на Go по пакетам, что такое модуль и go.mod, как импортировать свой пакет и чужой (go get, go mod tidy, go.sum) и какие команды go пригодятся каждый день.
Справочник
- all goroutines are asleep — deadlockЧто значит fatal error: all goroutines are asleep - deadlock! в Go и как найти причину: канал без получателя, незакрытый канал в range, лишний wg.Add, WaitGroup по значению.
- defer в Go — что это и как работаетЧто делает defer в Go: отложенный вызов при выходе из функции, порядок «последним вошёл — первым вышел», когда вычисляются аргументы, закрытие файлов, recover и ловушки с циклами и os.Exit.
- go mod init и ошибка go.mod file not foundПочему go run и go build пишут go.mod file not found, как создать модуль командой go mod init, какое имя модулю дать и что делать с cannot determine module path.
- go: command not found — команда go не найденаЧто делать, если терминал не находит команду go после установки: перезапуск терминала, переменная PATH в Windows, Linux и macOS, go под sudo и утилиты из go install.
- panic: assignment to entry in nil mapПочему Go падает с паникой assignment to entry in nil map, как создать map через make или литерал, и где nil-map прячется — в полях структур и в map внутри map.
- panic: runtime error: index out of rangeПочему Go падает с ошибкой index out of range или slice bounds out of range, как читать сообщение и где обычно ошибка: условие цикла, пустой срез, make без длины, os.Args.
- Как отсортировать срезСортировка в Go: sort.Ints и sort.Strings, slices.Sort, по убыванию через slices.Reverse, срез структур по полю через slices.SortFunc и sort.Slice, устойчивая сортировка и русские буквы.
- Как перевести строку в число и обратноПеревод строки в число в Go через strconv.Atoi, ParseInt и ParseFloat, число в строку — strconv.Itoa и fmt.Sprintf, обработка ошибки invalid syntax и почему string(65) даёт A.
- Как прочитать строку с пробеламиКак в Go прочитать строку целиком, а не одно слово: bufio.Scanner, чтение всех строк до конца ввода, длинные строки и ошибка token too long, bufio.Reader.ReadString.
- Как сделать HTTP-сервер на GoПростой веб-сервер на Go без сторонних библиотек: net/http, обработчики, маршруты с методом и параметром пути (Go 1.22), ответ в JSON, проверка через curl и адрес только для своего компьютера.
- Как собрать программу под Windows из LinuxКросс-компиляция в Go: переменные GOOS и GOARCH, сборка .exe для Windows из Linux и macOS, программы для Linux на ARM и Raspberry Pi, команды для PowerShell и cmd, cgo и CGO_ENABLED.
- Как установить GoУстановка Go в Windows, macOS и Linux с официального сайта go.dev: установщик, архив в /usr/local/go, переменная PATH, проверка go version, обновление и удаление.
- Ошибка declared and not usedПочему Go не собирает программу с неиспользуемой переменной, как исправить declared and not used — удалить переменную, использовать её или заменить на _, и где эта ошибка подстерегает.
- Ошибка imported and not usedЧто значит imported and not used в Go, как убрать лишний import вручную или автоматически через goimports и VS Code, и зачем бывает import с подчёркиванием.
- Случайное число в GoКак получить случайное число в Go через math/rand/v2: IntN, число в диапазоне, дробное, перемешать срез, повторяемая последовательность и crypto/rand для паролей и токенов.
- Срез и массив — разницаЧем массив в Go отличается от среза: длина, копирование при присваивании и передаче в функцию, общая память у частей среза и ловушка с append.
Официальная документация
- Официальная документация Go — https://go.dev/doc/
- Тур по Go — знакомство с языком в браузере (на английском) — https://go.dev/tour/
- Справочник стандартной библиотеки — https://pkg.go.dev/std