Пакеты и модули

4. Пакеты и модули #

4.1 Основы организации кода #

В Go пакеты — это базовый способ организации кода. Каждый файл принадлежит какому-либо пакету. Основной пакет — это main, он обязателен для создания исполняемой программы.

Правила: #

  • Название пакета обычно совпадает с именем директории.
  • Пакет main является точкой входа программы и содержит функцию main.
  • Каждый файл пакета должен начинаться с package имя_пакета.

Пример структуры:

myproject/
├── main.go         // Пакет main
├── utils/
│   ├── math.go     // Пакет utils
│   └── string.go   // Пакет utils

Пример файла math.go:

package utils

// Функция для сложения чисел
func Add(a, b int) int {
    return a + b
}

Пример файла main.go:

package main

import (
    "fmt"
    "myproject/utils"
)

func main() {
    fmt.Println(utils.Add(3, 5)) // 8
}

4.2 Использование стандартной библиотеки #

Go включает мощную стандартную библиотеку, которая покрывает множество повседневных задач.

Основные категории стандартных пакетов: #

  • Работа с вводом/выводом: fmt, io, os.
  • Форматирование и обработка строк: strings, strconv.
  • Коллекции и контейнеры: sort, sync, container/list.
  • Работа с сетью: net, net/http.
  • Работа с временем: time.

Пример использования нескольких стандартных пакетов:

package main

import (
    "fmt"
    "os"
    "time"
)

func main() {
    fmt.Println("Current time:", time.Now())

    file, err := os.Create("example.txt")
    if err != nil {
        fmt.Println("Error creating file:", err)
        return
    }
    defer file.Close()

    file.WriteString("Hello, Go!")
    fmt.Println("File created successfully!")
}

4.3 Создание собственных пакетов #

Шаги: #

  1. Создание директории: Создайте папку для нового пакета, например, utils/.
  2. Определите пакет: В файле укажите имя пакета (должно совпадать с именем папки).
  3. Импортируйте и используйте пакет: Подключите созданный пакет в другом файле.

Пример math.go:

package utils

// Sub вычитает одно число из другого
func Sub(a, b int) int {
    return a - b
}

Пример использования в main.go:

package main

import (
    "fmt"
    "myproject/utils"
)

func main() {
    result := utils.Sub(10, 5)
    fmt.Println("Разность:", result) // Разность: 5
}

4.4 Управление зависимостями с помощью Go Modules #

Go Modules — это встроенный инструмент для управления зависимостями.

Шаги работы с модулями: #

1. Инициализация модуля: #

go mod init myproject

Создаст файл go.mod:

module myproject

go 1.20

2. Добавление зависимостей: #

Импортируйте нужный пакет в коде:

import "github.com/fatih/color"

Затем выполните:

go get github.com/fatih/color

Добавится запись в go.mod:

require github.com/fatih/color v1.13.0

3. Обновление зависимости: #

go get -u github.com/fatih/color

4. Удаление ненужных зависимостей: #

Go автоматически управляет зависимостями. Если пакет больше не используется, выполните:

go mod tidy

4.5 Импорт и экспорт символов #

Правила: #

  • Экспортируемые символы: Начинаются с заглавной буквы.
  • Неэкспортируемые символы: Начинаются с маленькой буквы.

Пример:

package utils

// Экспортируемая переменная
var Version = "1.0"

// Неэкспортируемая переменная
var hidden = "secret"

// Экспортируемая функция
func Multiply(a, b int) int {
    return a * b
}

Импорт в main.go:

package main

import (
    "fmt"
    "myproject/utils"
)

func main() {
    fmt.Println("Version:", utils.Version)  // Доступно
    // fmt.Println(utils.hidden)            // Ошибка: неэкспортируемый символ
}

Пропущенные импорты: #

Если пакет импортирован, но не используется, компилятор выдаст ошибку. Для обхода этого правила можно импортировать пакет с _:

import _ "net/http" // Пакет подключён, но не используется явно

4.6 Организация и сборка проекта #

Структура типичного проекта: #

myproject/
├── go.mod         // Управление модулями
├── main.go        // Основной файл программы
├── utils/         // Пакет utils
│   ├── math.go
│   └── string.go
└── cmd/           // Отдельные исполняемые программы
    ├── server/
    │   └── main.go
    └── client/
        └── main.go

Сборка проекта: #

Чтобы скомпилировать проект, выполните:

go build

Или для создания исполняемого файла:

go build -o myapp

Запуск без сборки: #

go run main.go

4.7 Практические советы #

  1. Используйте группировку импортов:
    import (
        "fmt"
        "myproject/utils"
    )
    
  2. Проверяйте зависимости с помощью:
    go list -m all
    
  3. Для публикации модуля убедитесь, что проект находится на GitHub или аналогичной платформе:
    git tag v1.0.0
    git push origin v1.0.0
    
  4. Избегайте циклических зависимостей между пакетами.