Как правильно импортировать локальные пакеты в Go (Golang) — пошаговое руководство
Проблема: вы используете старый подход без модулей
В современных версиях Go (1.11+) для работы с локальными пакетами обязательно нужно использовать систему модулей. Ошибка возникает, потому что Go ищет ваш пакет в стандартной библиотеке (GOROOT) или в GOPATH, а не в текущей папке.
Решение: создайте модуль для вашего проекта
Вот пошаговая инструкция, которая решит вашу проблему:
# 1. Перейдите в корневую папку проекта
cd myproject
# 2. Инициализируйте модуль (выберите любое имя, например, myapp)
go mod init myapp
# 3. Теперь в main.go используйте имя модуля как корень для импорта
После этого ваш main.go должен выглядеть так:
package main
import (
"fmt"
"myapp/helpers" // имя модуля + путь к папке
)
func main() {
result := helpers.Add(2, 3)
fmt.Println(result)
}
Теперь запускайте:
go run main.go
# Вывод: 5
Почему это работает?
- go mod init создаёт файл
go.mod, который определяет корневой путь для всех импортов в проекте. - Импорт
"myapp/helpers"означает: "возьми модульmyappи найди в нём папкуhelpers". - Go автоматически сканирует все
.goфайлы в указанной папке и собирает их в один пакет.
Важные правила для локальных пакетов:
- Имя папки должно совпадать с именем пакета (в вашем случае папка
helpersиpackage helpers). - Экспортируемые имена (функции, типы, переменные) должны начинаться с большой буквы. У вас
Add— правильно. - Не используйте относительные пути (
./helpers,../helpers) — в Go они не работают для импорта. - Все файлы в одной папке должны принадлежать одному пакету (кроме
_test.goфайлов).
Полный пример рабочей структуры
После инициализации модуля ваш проект будет выглядеть так:
myproject/
├── go.mod # создан автоматически
├── main.go
└── helpers/
└── math.go
// go.mod:
module myapp
go 1.21
// helpers/math.go:
package helpers
func Add(a, b int) int {
return a + b
}
Запуск go run . или go run main.go теперь будет работать без ошибок.
Дополнительный совет: вложенные пакеты
Если у вас есть вложенные папки, например utils/strings/, то импорт будет:
import "myapp/utils/strings"
И в файлах внутри utils/strings/ должно быть package strings.
Альтернативный подход: использование GOPATH (устаревший, но возможный)
Если по каким-то причинам вы не хотите использовать модули (например, работаете с очень старым проектом), можно настроить GOPATH:
# Создайте структуру внутри GOPATH
mkdir -p $GOPATH/src/myproject
cd $GOPATH/src/myproject
# Разместите файлы как обычно
myproject/
├── main.go
└── helpers/
└── math.go
# В main.go используйте путь без имени модуля:
import "myproject/helpers"
Затем запускайте:
go run main.go
Почему этот способ не рекомендуется?
- Модули — это стандарт де-факто в Go с 2019 года.
- GOPATH усложняет работу с разными версиями зависимостей.
- Большинство современных туториалов и библиотек используют модули.
Быстрый чек-лист для диагностики
- Проверьте, что у вас есть
go.modв корне проекта. - Убедитесь, что имя пакета в
helpers/math.go— этоpackage helpers. - Импорт должен быть
"имя_модуля/helpers". - Функция
Addдолжна быть экспортируемой (с большой буквы).
Самый простой способ проверить: выполните go mod init myapp в корне и замените путь в импорте на "myapp/helpers". Это решит 99% проблем с локальными пакетами.