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