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 Создание собственных пакетов #
Шаги: #
- Создание директории: Создайте папку для нового пакета, например,
utils/
. - Определите пакет: В файле укажите имя пакета (должно совпадать с именем папки).
- Импортируйте и используйте пакет: Подключите созданный пакет в другом файле.
Пример 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 Практические советы #
- Используйте группировку импортов:
import ( "fmt" "myproject/utils" )
- Проверяйте зависимости с помощью:
go list -m all
- Для публикации модуля убедитесь, что проект находится на GitHub или аналогичной платформе:
git tag v1.0.0 git push origin v1.0.0
- Избегайте циклических зависимостей между пакетами.