go mod init и ошибка go.mod file not found
go: go.mod file not found in current directory or any parent directory; see 'go help modules'Команды go run ., go build и go get работают внутри модуля — папки с файлом go.mod. Ошибка значит, что ни в текущей папке, ни в одной папке выше файла go.mod нет. Решение — создать модуль в папке проекта:
cd hello
go mod init example.com/hello
go run .go mod init создаёт файл go.mod и отвечает go: creating new go.mod: module example.com/hello. Делается это один раз на проект.
Какое имя дать модулю
Имя (путь модуля) — то, с чего будут начинаться пути импорта его пакетов:
- для учебных программ подойдёт любое короткое:
hello,calc,example.com/hello; - для проекта, который будет лежать в репозитории, принято брать адрес репозитория:
github.com/имя/проект; - пробелы и русские буквы в имени не используйте.
Имя можно потом поменять в первой строке go.mod (module …), но тогда придётся исправить и все import своих пакетов.
Проверьте, где вы находитесь
Частая причина ошибки — модуль создан, но команда запущена из другой папки: из папки выше проекта или из домашней. Посмотрите текущую папку и её содержимое:
pwd
lsВ Windows — cd без параметров и dir. В списке должен быть go.mod. В VS Code откройте именно папку проекта (File → Open Folder, в русской версии «Файл» → «Открыть папку»), а не папку выше: тогда и встроенный терминал откроется в ней.
Запуск одного файла без модуля
Программу из одного файла, которая использует только стандартную библиотеку, можно запустить и без go.mod, назвав файл:
go run main.goДля чужих пакетов (go get) и для программ из нескольких пакетов модуль всё равно понадобится — проще создать его сразу.
Другие сообщения go mod init
go: cannot determine module path for source directory …—go mod initзапущен без имени. Укажите имя явно:go mod init hello.go: …/go.mod already exists— модуль в этой папке уже есть, создавать его заново не нужно.go: to add module requirements and sums: go mod tidy— в папке уже есть файлы сimportчужих пакетов. Выполнитеgo mod tidy, и Go скачает их.
Подводные камни
- Модуль внутри модуля. Если
go mod initвыполнить в подпапке проекта, получится второй, отдельный модуль, и пакеты из него перестанут импортироваться по старым путям. Обычно на весь проект одинgo.mod— в его корневой папке. - Старые инструкции про GOPATH. До появления модулей проекты нужно было класть в папку
GOPATH/src. Сейчас это не нужно: модуль может лежать в любой папке. Если в старой статье советуютGO111MODULE=off— это способ вернуть старое поведение, для новых проектов он не нужен. - Версия в go.mod. Строка
go 1.22(или с номером вашей версии) — минимальная версия Go для этого кода. Ставить туда номер выше установленного не стоит: Go попытается скачать более новую версию для сборки.
Подробно о модулях и пакетах — в уроке Пакеты и модули.