Пакеты, тестирование, файлы и 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 — нельзя. Это делает видимость немедленно читаемой прямо из исходника, без необходимости искать объявление в отдельном месте.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения. Преподаватель получит доступ к диалогу, когда вы попросите его помочь.

Проверка решения остаётся отдельным действием.