Skip to content

Пакеты и импорт пакетов

Как и многие современные языки программирования, код Go также организован в виде пакетов. Чтобы использовать экспортированные элементы кода: функции, типы, переменные и именованные константы и т. д. — в указанном пакете, этот пакет должен быть сначала импортирован, за исключением стандартного пакета builtin. 

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

Давай рассмотрим небольшую программу, которая импортирует стандартный пакет кода. Предположим, что исходный код этой программы хранится в файле с именем simple-import-demo.go.

Пояснения:

  • В первой строке указывается имя пакета, содержащего исходный файл simple-import-demo.go. Входная main функция программы должна быть помещена в пакет с именем main.

  • Третья строка импортирует fmt стандартный пакет с помощью import ключевого слова is. Идентификатор fmt — это имя пакета. Он также используется в качестве имени импорта и представляет этот стандартный пакет в объеме, содержащем исходный файл. В этом стандартном пакете объявлено много функций форматирования, которые можно использовать в других пакетах. Функция Println — одна из них. Он выведет строковые представления произвольного числа аргументов на стандартный вывод.

  • Шестая строка вызывает Println функцию. Обрати внимание, что имя функции начинается с префикса fmt. в вызове, где fmt — это имя пакета, который содержит вызываемую функцию. Форма aImportName.AnExportedIdentifier называется квалифицированным идентификатором, о котором ты можешь узнать подробнее по ссылке. AnExportedIdentifier называется неквалифицированным идентификатором.

  • Вызов fmt.Println функции не имеет требований к своим аргументам, поэтому в этой программе три его аргумента будут выведены как значения их соответствующих типов по умолчанию — string, int и string.

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

Запустив эту программу, ты получишь следующий вывод:

Обрати внимание, что в исходном файле, который импортирует пакет, можно использовать только экспортированные элементы кода из пакета. Экспортированный элемент кода использует в качестве имени экспортированный идентификатор. Например, первый символ идентификатора Println — заглавная буква, поэтому Println функция экспортируется.  Это значит, что Println функцию, объявленную в fmt стандартном пакете, можно использовать в приведенной выше программе-примере.

Подробнее об экспортированном идентификаторе ты можешь узнать по ссылке.

Встроенные функции print и println имеют те же функции, что и соответствующие функции в fmt стандартном пакете. Встроенные функции можно использовать без импорта каких-либо пакетов.

Обрати внимание, что две встроенные функции print и println не рекомендуется использовать в производственной среде, поскольку не гарантируется, что они останутся в будущих версиях Go.

Подробнее о стандартных пакетах ты можешь узнать здесь.

Кстати, мы можем запустить локальный сервер для просмотра документации Go, о чём подробнее ты можешь узнать на сайте go101.

Импорт пакета также формально называется декларацией импорта в Go. Декларация импорта видна только для исходного файла, содержащего декларацию импорта. Он не виден другим исходным файлам в том же пакете.

Давай рассмотрим другой пример.

В этом примере импортируется еще один стандартный пакет — math/rand пакет, который является подпакетом math стандартного пакета. Этот пакет предоставляет некоторые функции для создания псевдослучайных чисел.

Пояснения:

  • В этом примере имя пакета rand используется как имя импортируемого math/rand стандартного пакета. Вызов rand.Uint32() вернет случайное uint32 целое число.

  • Printf — еще одна часто используемая функция в fmt стандартном пакете. Вызов Printf функции должен принимать хотя бы один аргумент. Первым аргументом Printf вызова функции должно быть string значение, указывающее формат вывода результата. Первый %v аргумент называется глаголом формата, он будет заменен строковым представлением второго аргумента. \n строковый литерал в двойных кавычках будет экранирован как символ новой строки.

Приведенная выше программа всегда будет выводить:

Если мы ожидаем, что приведенная выше программа будет генерировать разные случайные числа при каждом запуске, мы должны установить другое начальное число, вызвав rand.Seed функцию, когда программа только запускается.

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

Пример:

Пояснения:

  • Этот пример импортирует еще один пакет — time стандартный пакет, который предоставляет множество утилит, связанных со временем.

  • Функция time.Now() возвращает текущее время как значение типа time.Time.

  • UnixNano является методом time.Time типа. Вызов метода aTime.UnixNano() возвращает количество наносекунд, прошедших с 1 января 1970 года по всемирному координированному времени, до времени, обозначенного aTime. Возвращаемый результат — это значение типа int64, которое является типом параметра rand.Seed функции. Методы — это специальные функции.

Подробнее о методах ты можешь узнать в статье Go.