Пакеты и видимость

Как Go организует код в пакеты и почему регистр первой буквы решает, что видно снаружи.

В Go видимость определяется регистром: имя с Заглавной буквы экспортируется (видно из других пакетов), со строчной — приватно для своего пакета.

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

Пакет — это набор файлов в одной папке с общим именем пакета в первой строке. Код внутри пакета видит все свои объявления независимо от того, в каком файле они лежат. Пакеты — основная единица переиспользования: стандартная библиотека и сторонние модули поставляются именно пакетами.

Экспорт через заглавную букву

В Go нет ключевых слов public и private. Вместо них — простое правило: Заглавная первая буква = экспорт. Это касается функций, типов, полей структур, констант и переменных.

// файл mathx/mathx.go
package mathx

// Square экспортирована — видна снаружи (заглавная S).
func Square(x int) int {
    return x * x
}

// helper приватна — только внутри пакета mathx (строчная h).
func helper() int {
    return 42
}
// файл main.go
package main

import (
    "fmt"

    "example.com/myapp/mathx"
)

func main() {
    fmt.Println(mathx.Square(5)) // OK
    // mathx.helper()            // ОШИБКА: не экспортирована
}

Вывод:

25

К экспортированному имени обращаются через имя пакета: mathx.Square, fmt.Println, strings.ToUpper. Поэтому имена пакетов делают короткими и в нижнем регистре.

Импорты

Несколько импортов оформляют блоком в скобках. gofmt сам сортирует их и группирует. Можно дать пакету псевдоним, если имена конфликтуют.

import (
    "fmt"
    "strings"

    r "math/rand" // псевдоним: обращаемся как r.Intn
)

Документация пакета

Комментарий прямо над объявлением — это и есть документация. Инструмент go doc и сайт pkg.go.dev собирают её автоматически. По соглашению комментарий начинается с имени того, что описывает: // Square возвращает квадрат числа.

ИмяВидимость
Square, User, MaxSizeэкспортируется
helper, user, maxSizeприватно для пакета

Итог

  • Пакет — это папка с файлами, объявляющими одно имя пакета.
  • Заглавная первая буква экспортирует имя, строчная делает его приватным.
  • К экспортированному обращаются через пакет.Имя; комментарий над объявлением — это документация.
Проверьте себя
1. Как в Go сделать функцию доступной из других пакетов?
AПометить её словом public
BНазвать её с заглавной первой буквы
CПоместить в пакет export
DДобавить аннотацию @export
2. Что такое пакет в Go?
AОдин файл с кодом
BНабор файлов в одной папке с общим именем пакета
CАрхив с зависимостями
DКласс с методами
3. Будет ли видна снаружи функция с именем helper?
AДа, всегда
BНет, строчная буква делает её приватной для пакета
CТолько если импортировать с псевдонимом
DТолько в пакете main
Поддержать проект