Пакеты: организация кода Go
Объявления пакетов, импорты и экспортируемые имена
«Пакеты: организация кода Go» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Что такое пакет
Каждый исходный файл Go принадлежит пакету. Имя пакета указывается в начале каждого файла. Пакеты объединяют связанный код и управляют его видимостью:
// file: math/calc.go
package math
// Exported — accessible from other packages (capital letter)
func Add(a, b int) int { return a + b }
// Unexported — package-private (lowercase)
func helper() int { return 42 }Объявление пакета и путь импорта
Имя пакета (краткое) отличается от пути импорта (полного пути модуля или каталога):
// Import path: github.com/myapp/util/stringutil
// Package name: stringutil (last segment by convention)
package stringutil
func Reverse(s string) string {
r := []rune(s)
for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
return string(r)
}Импорт пакетов
Используйте import, чтобы подключать другие пакеты. Go требует, чтобы все импорты использовались:
package main
import (
"fmt" // standard library
"strings" // standard library
"github.com/myapp/util/math" // third-party or local
)
func main() {
fmt.Println(strings.ToUpper("hello"))
fmt.Println(math.Add(1, 2))
}Экспортируемые и неэкспортируемые идентификаторы
Идентификаторы, начинающиеся с прописной буквы, являются экспортируемыми (общедоступными). Идентификаторы со строчной буквы являются неэкспортируемыми (доступными только внутри пакета):
package server
// Exported: accessible from other packages
type Server struct {
Addr string // exported field
timeout int // unexported field
}
// Exported method
func (s *Server) Start() error { return nil }
// Unexported helper
func (s *Server) listen() {}Пакет main и функция main
Пакет main является особым: он определяет исполняемую программу. Функция main служит точкой входа:
package main
import "fmt"
func main() {
fmt.Println("Hello, Go!")
// Program starts here and ends here
}
// All other packages are libraries — no main() neededФункция init()
Каждый пакет может содержать одну или несколько функций init(), которые автоматически выполняются перед main() в порядке объявления:
package config
import "fmt"
var DB string
func init() {
DB = "localhost:5432/mydb"
fmt.Println("config package initialized")
}
// init runs once when the package is first imported
// Multiple init() functions per file/package are allowedПустой импорт только ради побочных эффектов
Импортируйте пакет только ради побочных эффектов его init(), используя пустой идентификатор:
package main
import (
"database/sql"
_ "github.com/lib/pq" // registers PostgreSQL driver via init()
)
func main() {
db, err := sql.Open("postgres", "host=localhost dbname=test")
_ = db
_ = err
}Импорты с псевдонимами
Переименуйте пакет при импорте, чтобы избежать конфликтов имён или сократить запись:
package main
import (
"fmt"
gomath "math" // alias to avoid collision
mymath "github.com/me/math"
)
func main() {
fmt.Println(gomath.Sqrt(16)) // 4
fmt.Println(mymath.Add(1, 2)) // 3
}Соглашения об именовании пакетов
Соглашения Go об именовании пакетов:
- Короткое имя, строчные буквы, одно слово:
http,json,fmt - Имя должно совпадать с именем каталога:
util/stringutil/→ пакетstringutil - Не используйте символы подчёркивания и camelCase в именах пакетов
- Избегайте общих имён, таких как
util,common,helper - Имя пакета является частью идентификатора: предпочитайте
http.Clientвместоhttplib.HTTPClient
Циклические импорты
Go НЕ (NOT) допускает циклические импорты. Пакет A не может импортировать B, если B импортирует A. Решите проблему, вынеся общий код в третий пакет:
// WRONG: A imports B, B imports A — compile error
// package a imports "myapp/b"
// package b imports "myapp/a"
// SOLUTION: extract shared types to package c
// package a imports "myapp/c"
// package b imports "myapp/c"
// No circular dependencyБыстрая проверка
Что делает идентификатор экспортируемым в Go?
Итоги: пакеты
Основные понятия, связанные с пакетами:
- Каждый файл начинается с
package name - Прописная буква означает экспортируемый (общедоступный) идентификатор, строчная — неэкспортируемый (доступный только внутри пакета)
- Импортируйте по полному пути, а используйте по краткому имени пакета
init()автоматически выполняется передmain()- Пустой импорт
_ "pkg"используется только ради побочных эффектов - Циклические импорты запрещены
Часто задаваемые вопросы
Урок «Пакеты: организация кода Go» бесплатный?
Да — полный текст урока «Пакеты: организация кода Go» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Пакеты: организация кода Go»?
Объявления пакетов, импорты и экспортируемые имена Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Пакеты: организация кода Go»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Пакеты: организация кода Go
- Модули Go с go mod
- Добавление внешних зависимостей
- Внутренние пакеты и рабочие пространства