Пакеты

В Go все программы состоят из пакетов. Пакеты выполняют роль неймспейсов и используются для группировки функций. Например, в предыдущем уроке мы использовали функцию Print из пакета fmt:

fmt.Print("Hello, World!")

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

package main

func main() {
  // Здесь будет код, который будет исполняться при запуске программы
}

Пакет может состоять из одного или нескольких файлов с расширением .go. Пакеты определяются с помощью ключевого слова package в начале каждого файла пакета:

// Название должно быть коротким и простым
// Пишется в нижнем регистре без подчеркиваний
// Как правило, это просто существительные
package pkgname
// Здесь описывается содержимое пакета

Пакет располагается всегда внутри какой-то директории. Одна директория может содержать только один пакет. В Go принято такое соглашение, что имя пакета совпадает с последним элементом пути импорта.

Например, пакет pkgname может находиться внутри нескольких вложенных директорий dir1/dir2/pkgname и данный он будет импортироваться следующий образом:

import "dir1/dir2/pkgname"

Часто вы будете импортировать сразу несколько пакетов в одном файле:

import "pkgname1"
import "pkgname2"
import "pkgname3"

Но есть еще один способ, который рекомендуется использовать в этом случае и он предпочтителен в Go - это групповой импорт пакетов:

import (
  "pkgname1"
  "pkgname2"
  "pkgname3"
)

Чтобы иметь возможность использовать какой-то тип или вызвать какую-то функцию из другого пакета, их имена должны быть экспортируемые. Это значит, что имя должно начинается с заглавной буквы. Например, Hello это экспортируемое имя, в то время как hello – неэкспортируемое. Все неэкспортируемые имена недоступны за пределами пакета и к ним нельзя обратиться. Для всех экспортируемых имен принято писать комментарии с описанием и линтеры обычно указывают на это.

Начало комментарий для экспортируемого имени всегда имеет следующий вид:

// Name описание.

Далее приведены примеры экспортируемой и неэкспортируемой функции.

package pkgname

import "fmt"

// Hello приветствует пользователя. Экспортируемая функция, может вызываться 
// из других пакетов за пределами пакета pkgname.
func Hello() {
  hello()
}

// Неэкспортируемая функция, может вызываться только внутри текущего пакета 
// pkgname.
func hello() {
  fmt.Print("Hello, World!")
}

Если вы экспортируете несколько пактов, у которых имена совпадают, то можно использовать алиасы или синонимы и обращаться к этим пакетам по ним:

import (
  "some/pkgname"
  pkgname1 "another/pkgname"
)

Существует еще два способа импорта пакетов - импорт с точкой и подчеркиванием:

import (
  . "pkgname2"
  _ "pkgname1"
)

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

Импорт пакета с подчеркиванием может понадобиться тогда, когда необходимо выполнить в нем функцию init, но при этом сам пакет в коде нигде не используется. Про функцию init можно почитать по ссылке ниже в советах.

Задание

Определите пакет solution и поместите в него функцию Hello(), которая выводит на экран строчку “Hello, World!”. Помните, что функция должна быть экспортируемой, чтобы ее можно было вызвать из другого пакета. Не забудьте написать комментарий с описанием данной функции.


Советы


Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном cообществе
Упражнение доступно только авторизованным пользователям.

Пожалуйста, авторизуйтесь, это необходимо для отслеживания прогресса выполнения уроков. Если у вас ещё нет учётной записи, то сейчас самое время создать аккаунт.