0Pricing
Go Academy · Урок

Пакеты: организация кода 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 — локальная установка не требуется.

Все уроки этого курса

  1. Пакеты: организация кода Go
  2. Модули Go с go mod
  3. Добавление внешних зависимостей
  4. Внутренние пакеты и рабочие пространства
← Назад к Go Academy