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

Лекция 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 = 10
count = "десять"

Статическая типизация помогает находить часть ошибок до запуска программы.

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

ХарактеристикаPythonGo
Типизациядинамическаястатическая с выводом типов
Выполнениечерез реализацию Pythonкомпиляция в машинный код
Форматированиенесколько распространённых стилейстандартный gofmt
Ошибки операцийчасто исключенияобычно отдельное значение error
Коллекцииlist, tuple, set, dictarray, slice, map
Классыестьклассов и наследования нет
Абстракцииклассы, ABC, duck typingструктуры, методы, интерфейсы
Конкурентностьthreads, processes, asynciogoroutines, 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 go
go version

5.2. macOS

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

  • Apple Silicon: arm64;
  • Intel: amd64.

Архитектуру можно узнать командой:

Окно терминала
uname -m

Значение arm64 указывает на Apple Silicon, x86_64 — на Intel.

5.3. Windows

Рекомендуется официальный MSI-установщик. После установки нужно открыть новое окно PowerShell и выполнить:

Окно терминала
go version
Get-Command go

Если команда не найдена, сначала следует перезапустить терминал. Редактировать PATH вручную нужно только после проверки параметров установщика.

6. Редактор и языковой сервер

Рекомендуемая среда — Visual Studio Code и официальное расширение Go. Оно устанавливает и использует языковой сервер gopls, который обеспечивает:

  • автодополнение;
  • переход к определению;
  • поиск ошибок;
  • автоматический импорт пакетов;
  • форматирование;
  • запуск тестов.

Редактор помогает, но не заменяет командную строку. Все работы должны собираться и проверяться стандартной командой go.

7. Первая программа

Создадим каталог проекта и перейдём в него.

Linux и macOS:

Окно терминала
mkdir hello-go
cd hello-go

Windows PowerShell:

Окно терминала
New-Item -ItemType Directory hello-go
Set-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 GOROOT
  • GOOS — целевая операционная система;
  • 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:GOOS
Remove-Item Env:GOARCH

Собранный файл нельзя запустить на текущей системе, если целевая система другая. Кросс-компиляция показывает, что исходный код и исполняемый файл — не одно и то же.

14. Типичные ошибки начинающих

Запуск вне модуля

Если команда сообщает, что файл go.mod не найден, нужно перейти в корень проекта или выполнить go mod init для нового проекта.

Неиспользуемый импорт

import "strings" // ошибка, если пакет не используется

Go требует удалять ненужные зависимости сразу.

Несохранённый файл

Редактор показывает новый код, но go run . запускает старую сохранённую версию. Перед запуском нужно сохранить изменения.

Неправильный каталог

Полезно проверить:

Окно терминала
go env GOMOD

Команда показывает, какой модуль сейчас используется.

Ручное форматирование

Не нужно тратить время на выравнивание кода пробелами. Используйте:

Окно терминала
go fmt ./...

15. Вопросы для самопроверки

  1. Для каких задач чаще всего применяется Go?
  2. Чем статическая типизация отличается от динамической?
  3. Что создаёт команда go mod init?
  4. Чем пакет отличается от модуля?
  5. Для чего нужны go run и go build?
  6. Почему неиспользуемый импорт является ошибкой?
  7. Как определить текущие GOOS и GOARCH?
  8. Почему абсолютный путь ухудшает переносимость?
  9. Какую роль выполняют пакет main и функция main?
  10. Для чего нужен gofmt?

Итоги

Go предоставляет единый цикл разработки на Linux, macOS и Windows. Проект оформляется как модуль, исходные файлы объединяются в пакеты, а исполняемая программа начинается с package main и func main. Стандартная команда go запускает, собирает, форматирует и проверяет проект независимо от операционной системы.