Skip to content

Пакеты Go

Из этой темы ты узнаешь:

  • что такое пакеты и каких типов они бывают;

  • как создавать и импортировать пакеты;

  • из каких шагов состоит инициализация.

Что такое пакет

Пакет — это папка с набором файлов go. Каждый файл go должен быть частью некоторого пакета.

Пакеты в Go должны быть маленькими и многочисленными.

  • Старайся, чтобы структура каталогов была как можно более плоской. То есть не вкладывай пакеты внутрь пакетов (не всегда используется на практике).

Типы пакетов

  • Исполняемые пакеты:

  • В них генерируются исполняемые файлы, которые можно запустить.

  • Имя исполняемого пакета предопределено и называется main

  • Этот пакет должен иметь функцию с именем main.

  • Функция main сообщает go, с чего начать выполнение кода.

  • Она не принимает никаких входных параметров и ничего не возвращает.

  • Неисполняемые пакеты:

  • Библиотеки или зависимости, которые используются другими пакетами. Пример — fmt

  • Они могут иметь любое имя.

  • Их нельзя выполнить как исполняемый пакет, только импортировать.

  • Все пакеты, кроме main, являются неисполняемыми пакетами.

Файл, который является частью main пакета и содержит main функцию, может не называться main.go

Создание и импорт пакетов

Все файлы в каталоге должны принадлежать одному и тому же пакету.

  • Не допускается наличие файлов, принадлежащих разным пакетам, в одном и том же каталоге.

  • Точно так же мы не можем иметь файлы одного пакета в нескольких каталогах.

Идиоматично использовать простое и короткое имя для пакетов, например, time, http, список, а также не рекомендуется использовать «_»,хотя он очень часто используется в больших проектах, а также camelCase в названиях пакетов.

Обычное соглашение состоит в том, чтобы имя папки совпадало с именем пакета.

Другие пакеты могут использовать только имена функций/переменных, начинающиеся с прописной буквы (считающиеся общедоступными).

Если имена функций/переменных написаны строчными буквами, они будут считаться приватными (private) и не будут экспортированы. То есть будут недоступны во внешних пакетах, доступ будет осуществляться на уровне пакета (каталога, папки), в котором они находятся.

  • Имей в виду, что при импорте пакета мы импортируем весь каталог. Таким же образом произойдет оптимизация во время компиляции, неиспользуемый функционал пакета не будет присутствовать в исполняемом файле.

  • Обычно исходный файл называют так же, как и каталог пакета. Это не обязательно.

  • Пакет все равно будет импортирован таким же образом, поскольку мы импортируем весь каталог, то есть все файлы в папке, а не один файл go.

  • Области видимости в Go 

  • На уровне пакета ты можешь использовать переменные в других файлах, принадлежащих тому же пакету, без необходимости их экспорта (в верхнем регистре).

  • import операторы относятся к области файла и видны только в этом файле.

  • Поэтому, если ты хочешь использовать пакет, например fmt в нескольких файлах, его следует импортировать во все файлы, где используется функционал пакета fmt.

Пакет может содержать один файл.

Использование пакетов до модулей

Программисты Go обычно хранят весь свой код Go в одном рабочем пространстве.

  • Это было строгим требованием до версии 1.13, выпущенной в 2019 году.

  • После этой версии было предоставлено больше гибкости в отношении того, где ты можешь хранить исходный код.

  • Рабочая область — это не что иное, как каталог в твоей файловой системе, путь к которому хранится в переменной среде с именем GOPATH.

  • В Windows это  %USERPROFILE%\go, Например, C:\Users\ad\go.

  • На Mac и Linux это ~/go, например, /Users/john/go или /home/john/go.

  • Ты можешь распечатать значения переменных среды, выполнив команду go env.

    • go env | grep -i gopath
  • Для управления зависимостями ранее использовались сторонние инструменты, что было не очень удобно.