Лекция 1. Введение в Go и кроссплатформенный инструментарий
Цели лекции
После лекции студент должен:
- понимать, для каких задач создавался Go;
- отличать компиляцию Go от запуска программы на Python;
- установить Go на Linux, macOS или Windows;
- создать модуль и первую программу;
- пользоваться командами
go run,go build,go fmt,go testиgo env; - понимать назначение пакетов, функции
mainи файлаgo.mod; - не привязывать исходный код к конкретной операционной системе.
1. Что такое Go
Go — компилируемый язык программирования общего назначения со статической типизацией, сборкой мусора и встроенными средствами конкурентного выполнения. Проект появился в Google в 2007 году, публично был представлен в 2009 году, а версия Go 1 вышла в 2012 году.
Авторы языка стремились упростить разработку больших программ, в которых важны:
- быстрая сборка;
- понятный и единообразный код;
- простое управление зависимостями;
- эффективная работа с сетью;
- конкурентное выполнение большого количества задач;
- переносимость между операционными системами.
Название языка — Go. Слово Golang часто используется в поисковых запросах и адресе сайта, но не является официальным названием языка.
2. Где применяется Go
Go особенно распространён в следующих областях:
- серверные приложения и HTTP API;
- микросервисы;
- облачная инфраструктура;
- сетевые сервисы;
- CLI-утилиты;
- системы мониторинга;
- DevOps-инструменты;
- обработка данных и фоновые задачи.
На Go написаны многие известные инфраструктурные инструменты, например Docker, Kubernetes, Terraform и Prometheus. Это не означает, что Go предназначен только для DevOps: стандартная библиотека позволяет создавать обычные программы, веб-сервисы, клиенты баз данных и утилиты.
Go обычно не выбирают для браузерного интерфейса или нативного мобильного UI. Сильная сторона языка — серверная и инфраструктурная часть системы.
3. Основные свойства языка
3.1. Статическая типизация
Тип каждого выражения известен во время компиляции:
package main
import "fmt"
func main() { count := 10 fmt.Println(count)
// count = "десять" // ошибка компиляции: строку нельзя присвоить int}В Python имя может последовательно ссылаться на значения разных типов:
count = 10count = "десять"Статическая типизация помогает находить часть ошибок до запуска программы.
3.2. Компиляция в исполняемый файл
Команда go build создаёт нативный исполняемый файл. На целевой машине обычно
не требуется отдельно установленный Go:
go build -o hello .На Windows результатом будет файл hello.exe. На Linux и macOS расширение
обычно не используется.
3.3. Автоматическое управление памятью
Go использует сборщик мусора. Программист не освобождает обычные объекты вручную, но по-прежнему обязан явно закрывать внешние ресурсы: файлы, сетевые соединения, транзакции и потоки данных.
3.4. Небольшой язык и единый стиль
В Go сравнительно мало синтаксических конструкций. Стандартный инструмент
gofmt автоматически форматирует код, поэтому команды не спорят о пробелах,
переносах строк и расположении фигурных скобок.
3.5. Встроенная конкурентность
Функцию можно запустить конкурентно с помощью ключевого слова go:
go processFile("report.csv")Goroutines и channels подробно рассматриваются в конце курса. До этого момента программы будут последовательными.
4. Go и Python
| Характеристика | Python | Go |
|---|---|---|
| Типизация | динамическая | статическая с выводом типов |
| Выполнение | через реализацию Python | компиляция в машинный код |
| Форматирование | несколько распространённых стилей | стандартный gofmt |
| Ошибки операций | часто исключения | обычно отдельное значение error |
| Коллекции | list, tuple, set, dict | array, slice, map |
| Классы | есть | классов и наследования нет |
| Абстракции | классы, ABC, duck typing | структуры, методы, интерфейсы |
| Конкурентность | threads, processes, asyncio | goroutines, channels, sync |
| Точка входа | условный блок __main__ | пакет main, функция main |
Go не является «ускоренным Python». При переходе важно освоить другой способ проектирования: явные типы, явную обработку ошибок и композицию вместо иерархий классов.
5. Установка Go
Актуальные установочные пакеты публикуются на странице go.dev/dl. Для курса требуется Go 1.27 или новее.
После установки во всех системах выполняется одна проверка:
go versionПример результата:
go version go1.27.1 darwin/arm64Последние два элемента обозначают операционную систему и архитектуру.
5.1. Linux
Можно использовать официальный архив с go.dev/dl или актуальный пакет
дистрибутива. При ручной установке важно следовать инструкции для выбранной
версии и добавить каталог Go в PATH.
Для проверки расположения программы:
command -v gogo version5.2. macOS
На странице загрузки нужно выбрать пакет для своей архитектуры:
- Apple Silicon:
arm64; - Intel:
amd64.
Архитектуру можно узнать командой:
uname -mЗначение arm64 указывает на Apple Silicon, x86_64 — на Intel.
5.3. Windows
Рекомендуется официальный MSI-установщик. После установки нужно открыть новое окно PowerShell и выполнить:
go versionGet-Command goЕсли команда не найдена, сначала следует перезапустить терминал. Редактировать
PATH вручную нужно только после проверки параметров установщика.
6. Редактор и языковой сервер
Рекомендуемая среда — Visual Studio Code и официальное расширение Go. Оно
устанавливает и использует языковой сервер gopls, который обеспечивает:
- автодополнение;
- переход к определению;
- поиск ошибок;
- автоматический импорт пакетов;
- форматирование;
- запуск тестов.
Редактор помогает, но не заменяет командную строку. Все работы должны собираться
и проверяться стандартной командой go.
7. Первая программа
Создадим каталог проекта и перейдём в него.
Linux и macOS:
mkdir hello-gocd hello-goWindows PowerShell:
New-Item -ItemType Directory hello-goSet-Location hello-goТеперь создадим модуль:
go mod init example.com/helloКоманда создаст файл go.mod:
module example.com/hello
go 1.27Создадим main.go:
package main
import "fmt"
func main() { fmt.Println("Hello, Go!")}Запуск:
go run .Ожидаемый результат:
Hello, Go!8. Разбор программы
package mainКаждый Go-файл относится к пакету. Исполняемая программа должна содержать пакет
main.
import "fmt"fmt — пакет стандартной библиотеки для форматированного ввода и вывода.
Неиспользуемый импорт считается ошибкой компиляции.
func main() { // ...}Функция main является точкой входа. Она не принимает аргументов и не возвращает
значение.
fmt.Println("Hello, Go!")Имя с заглавной буквы экспортируется из пакета. Поэтому функция называется
Println, а не println.
9. Основные команды
Запуск без сохранения исполняемого файла
go run .Go компилирует программу во временный файл и запускает его. Для учебных экспериментов это удобно, но для распространения программы используют сборку.
Сборка
go build .Имя результата обычно совпадает с последней частью пути модуля или каталога. Можно задать имя явно:
go build -o hello .Форматирование
go fmt ./..../... означает текущий пакет и все пакеты ниже него.
Проверка пакетов
go test ./...go vet ./...Даже если тестов пока нет, go test ./... компилирует пакеты и помогает
обнаружить ошибки структуры проекта.
Просмотр окружения Go
go envОсобенно полезны значения:
go env GOOS GOARCH GOMOD GOPATH GOROOTGOOS— целевая операционная система;GOARCH— архитектура процессора;GOMOD— путь к активномуgo.mod;GOPATH— рабочая область и кэш инструментов;GOROOT— установленный дистрибутив Go.
Не нужно создавать учебные проекты внутри GOROOT.
10. Модули и пакеты
Пакет — набор Go-файлов одного каталога с одинаковым объявлением package.
Модуль — набор связанных пакетов, версия Go и список зависимостей. Корень
модуля определяется файлом go.mod.
Пример будущей структуры:
task-manager/├── go.mod├── main.go├── internal/│ └── task/│ └── task.go└── README.mdВ начале курса достаточно одного пакета main. Делить программу на пакеты
следует по ответственности, а не создавать отдельный пакет для каждой функции.
11. Комментарии и стиль
Однострочный комментарий:
// Температура в градусах Цельсия.temperature := 21.5Многострочный комментарий:
/*Комментарий может заниматьнесколько строк.*/Комментарии к экспортируемым сущностям обычно начинаются с их имени:
// User описывает пользователя системы.type User struct { Name string}Соглашения Go:
- короткие локальные имена допустимы в небольшом контексте;
- имена пакетов короткие и пишутся строчными буквами;
- подчёркивание обычно не используется в именах;
- форматирование поручается
gofmt; - неиспользуемые переменные и импорты запрещены компилятором.
12. Кроссплатформенность
Программа переносима, если она не предполагает конкретную файловую систему, оболочку или формат пути.
Плохой пример:
path := "/home/student/project/data.txt"Переносимый подход будет изучен позже:
path := filepath.Join("data", "data.txt")В учебных программах нельзя:
- встраивать абсолютные пути;
- вызывать
bash,grep,sedили PowerShell без необходимости; - предполагать наличие диска
C:; - полагаться на расширение исполняемого файла;
- хранить в репозитории собранные бинарные файлы.
13. Кросс-компиляция
Go может собирать программу для другой операционной системы. В Bash/Zsh:
GOOS=windows GOARCH=amd64 go build -o hello.exe .В PowerShell:
$env:GOOS = "linux"$env:GOARCH = "amd64"go build -o hello .Remove-Item Env:GOOSRemove-Item Env:GOARCHСобранный файл нельзя запустить на текущей системе, если целевая система другая. Кросс-компиляция показывает, что исходный код и исполняемый файл — не одно и то же.
14. Типичные ошибки начинающих
Запуск вне модуля
Если команда сообщает, что файл go.mod не найден, нужно перейти в корень
проекта или выполнить go mod init для нового проекта.
Неиспользуемый импорт
import "strings" // ошибка, если пакет не используетсяGo требует удалять ненужные зависимости сразу.
Несохранённый файл
Редактор показывает новый код, но go run . запускает старую сохранённую версию.
Перед запуском нужно сохранить изменения.
Неправильный каталог
Полезно проверить:
go env GOMODКоманда показывает, какой модуль сейчас используется.
Ручное форматирование
Не нужно тратить время на выравнивание кода пробелами. Используйте:
go fmt ./...15. Вопросы для самопроверки
- Для каких задач чаще всего применяется Go?
- Чем статическая типизация отличается от динамической?
- Что создаёт команда
go mod init? - Чем пакет отличается от модуля?
- Для чего нужны
go runиgo build? - Почему неиспользуемый импорт является ошибкой?
- Как определить текущие
GOOSиGOARCH? - Почему абсолютный путь ухудшает переносимость?
- Какую роль выполняют пакет
mainи функцияmain? - Для чего нужен
gofmt?
Итоги
Go предоставляет единый цикл разработки на Linux, macOS и Windows. Проект
оформляется как модуль, исходные файлы объединяются в пакеты, а исполняемая
программа начинается с package main и func main. Стандартная команда go
запускает, собирает, форматирует и проверяет проект независимо от операционной
системы.