> For the complete documentation index, see [llms.txt](https://eda-1.gitbook.io/lgwt/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://eda-1.gitbook.io/lgwt/osnovy-go/install-go.md).

# Установка Go

Официальные инструкции по установке Go доступны [здесь](https://golang.org/doc/install).

## Среда Go

### Модули Go

В Go 1.11 были представлены [Модули](https://go.dev/wiki/Modules). Этот подход является режимом сборки по умолчанию начиная с Go 1.16, поэтому использование `GOPATH` не рекомендуется.

Модули призваны решать проблемы, связанные с управлением зависимостями, выбором версий и воспроизводимыми сборками; они также позволяют пользователям запускать Go-код вне `GOPATH`.

**Немного контекста: что было до модулей.** До Go 1.11 набор инструментов Go полагался на соглашение под названием `GOPATH` — переменную окружения, указывающую на один каталог на вашей машине (обычно `~/go`), где должен был находиться весь Go-код. Каждый проект, каждая зависимость и каждый скомпилированный пакет хранились в этом каталоге. Это означало, что вы не могли просто создать папку в любом месте на вашем компьютере и начать писать Go-код; компилятор не знал бы, как разрешать импорты за пределами `GOPATH`.

**Как модули решают каждую из этих проблем.** Для управления зависимостями файл `go.mod` внутри вашего проекта явно объявляет, какие внешние пакеты нужны вашему коду и в каких версиях, подобно `package.json` в Node.js. Для выбора версий Go использует детерминированный алгоритм под названием Minimum Version Selection (MVS): когда несколько зависимостей требуют разные версии одного и того же пакета, Go всегда выбирает минимальную версию, которая удовлетворяет всем, делая результат предсказуемым. Для воспроизводимых сборок Go генерирует файл `go.sum` рядом с `go.mod`, который содержит криптографический хеш каждой зависимости. Любой, кто собирает проект, загрузит абсолютно те же файлы, проверенные по этим хешам. Если что-то изменится на удаленном сервере, сборка немедленно завершится неудачей.

**Почему модули позволяют размещать код вне `GOPATH`.** Когда Go находит файл `go.mod` в каталоге, этот файл служит якорем проекта. Набор инструментов использует его для разрешения всех импортов относительно этого модуля, без необходимости глобальной ссылки на `GOPATH`. Это означает, что вы можете создать папку проекта в любом месте на вашей машине, и компилятор будет ее понимать.

Использование модулей довольно простое. Выберите любую директорию вне `GOPATH` в качестве корня вашего проекта и создайте новый модуль с помощью команды `go mod init`.

Будет сгенерирован файл `go.mod`, содержащий путь модуля, версию Go и его требования к зависимостям, которые являются другими модулями, необходимыми для успешной сборки.

Если `<modulepath>` не указан, `go mod init` попытается угадать путь модуля по структуре директорий. Его также можно переопределить, передав аргумент.

```sh
mkdir my-project
cd my-project
go mod init <modulepath>
```

Файл `go.mod` может выглядеть так:

```
module cmd

go 1.24

```

Объявленная здесь версия Go не просто информативна: набор инструментов использует ее для определения того, какая семантика языка применяется, даже если у вас установлена более новая версия Go. Например, Go 1.22 изменил принцип работы переменных в цикле `for`, поэтому код, полагающийся на это поведение (как мы делаем позже в главе [concurrency](/lgwt/osnovy-go/concurrency.md)), нуждается в `go.mod`, объявляющем `1.22` или более позднюю версию, чтобы работать ожидаемым образом. Поддержание этой версии в актуальном состоянии избавит вас от некоторой путаницы при отладке в дальнейшем.

Встроенная документация предоставляет обзор всех доступных команд `go mod`.

```sh
go help mod
go help mod init
```

## Линтинг Go

Улучшенная версия стандартного линтера может быть настроена с использованием [GolangCI-Lint](https://golangci-lint.run).

Его можно установить следующим образом:

```sh
brew install golangci-lint
```

## Рефакторинг и ваши инструменты

Большое внимание в этой книге уделяется важности рефакторинга.

Ваши инструменты могут помочь вам выполнять более масштабный рефакторинг с уверенностью.

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

* **Извлечение/встраивание переменной**. Присвоение имен "магическим" значениям позволяет быстро упростить код.
* **Извлечение метода/функции**. Крайне важно уметь брать часть кода и извлекать из нее функции/методы.
* **Переименование**. Вы должны быть в состоянии уверенно переименовывать символы во всех файлах.
* **go fmt**. У Go есть стилевой форматтер под названием `go fmt`. Ваш редактор должен запускать его при сохранении каждого файла.
* **Запуск тестов**. Вы должны быть в состоянии выполнить любое из вышеперечисленных действий, а затем быстро перезапустить тесты, чтобы убедиться, что ваш рефакторинг ничего не сломал.

Кроме того, чтобы помочь вам работать с кодом, вы должны уметь:

* **Просмотр сигнатуры функции**. Вы никогда не должны сомневаться в том, как вызвать функцию в Go. Ваша IDE должна описывать функцию с точки зрения ее документации, параметров и того, что она возвращает.
* **Просмотр определения функции**. Если всё ещё неясно, что делает функция, вы должны иметь возможность перейти к исходному коду и попытаться разобраться самостоятельно.
* **Поиск использования символа**. Понимание контекста функции может помочь вам принимать решения при рефакторинге.

Освоение ваших инструментов поможет вам сосредоточиться на коде и уменьшить переключение контекста.

## Подведение итогов

На данный момент у вас должен быть установлен Go, доступен редактор и настроены некоторые базовые инструменты. Go обладает очень большой экосистемой сторонних продуктов. Мы выделили здесь несколько полезных компонентов. Для более полного списка см. <https://awesome-go.com>.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://eda-1.gitbook.io/lgwt/osnovy-go/install-go.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
