Пакеты и модули: организация кода, видимость

К вопросам
Легкий
Modules & Packages

Вопрос

Как организована система пакетов в Go? Какие правила видимости существуют? Что такое Go modules и как они работают?

Ответ

Пакеты: - Единица компиляции и инкапсуляции - Все файлы в директории - один пакет - Имена с заглавной буквы - экспортируемые (public) - Имена со строчной буквы - приватные (package-scope) Go Modules: - Система управления зависимостями (с Go 1.11) - go.mod файл описывает модуль и зависимости - Семантическое версионирование - Proxy для загрузки модулей

// go.mod
module example.com/myproject

go 1.21

require (
    github.com/gorilla/mux v1.8.0
)

// internal package - доступен только из родительского модуля
myproject/
  ├── go.mod
  ├── main.go
  ├── internal/
  │   └── database/
  │       └── db.go
  └── api/
      └── handlers.go
// go.mod
module example.com/myproject

go 1.21

require (
    github.com/gorilla/mux v1.8.0
)

// internal package - доступен только из родительского модуля
myproject/
  ├── go.mod
  ├── main.go
  ├── internal/
  │   └── database/
  │       └── db.go
  └── api/
      └── handlers.go

Дополнительные вопросы

Что такое vendor директория? Как работает module proxy?