Пакеты, тестирование, файлы и JSON

Собственные пакеты: структура папок, exported и unexported имена

Содержание курса

Exported и unexported имена: правило заглавной буквы и ошибка компилятора при нарушении

Go не использует ключевые слова вроде public или private. Видимость имени определяется первой буквой его написания — и это единственное правило.

Идентификатор начинается с заглавной буквы → он exported, то есть виден из любого другого пакета. Начинается со строчной → unexported, виден только внутри того пакета, где объявлен.

Добавим в mathutil/mathutil.go две функции:

package mathutil

// Add — exported: доступна снаружи пакета
func Add(a, b int) int {
    return a + b
}

// subtract — unexported: доступна только внутри mathutil
func subtract(a, b int) int {
    return a - b
}

Теперь попробуем вызвать subtract из main:

package main

import "example.com/myapp/mathutil"

func main() {
    mathutil.subtract(5, 3) // это не скомпилируется
}

Компилятор вернёт:

./main.go:6:2: cannot refer to unexported name mathutil.subtract

Это не предупреждение — это ошибка, программа не соберётся. Исправление ровно одно: переименовать subtract в Subtract в файле mathutil/mathutil.go. Никаких аннотаций, никаких модификаторов доступа — только заглавная буква.

Правило распространяется на всё: функции, переменные, константы, типы. Если Pi начинается с заглавной — её можно импортировать, если pi — нельзя. Это делает видимость немедленно читаемой прямо из исходника, без необходимости искать объявление в отдельном месте.