#go
#Вперед
Вопрос:
Я пытаюсь запустить простую программу Go со следующей настройкой:
// main.go
package main
import (
"fmt"
"db"
"webapp"
)
func main() {
database := db.New()
webapp.StartServer(amp;database, amp;notifierClient)
}
Я получаю следующие ошибки импорта:
main.go:8:2: package db is not in GOROOT (C:Program FilesGosrcdb)
main.go:9:2: package webapp is not in GOROOT (C:Program FilesGosrcwebapp)
Структура папок, которая у меня есть, такова:
C:UsersUserDocumentsGolangsrcMyProjectsource
main.go
go.mod
go.sum
db/ several .go files
webapp/ several .go files
Я запустил go mod init
, и мой GOPATH
установлен на C:UsersUserDocumentsGolang
, но он продолжает искать локальные модули импорта внутри GOROOT
.
Где я ошибаюсь?
Комментарии:
1. Я бы рекомендовал использовать go mod.
go mod init somegit.com/someuser/somemodule
и затемgo mod tidy
.
Ответ №1:
Вам нужно добавить имя вашего модуля, например myapp
, перед путем импорта:
import (
"myapp/db"
"myapp/webapp"
)
Путь импорта — это строка, используемая для импорта пакета. Путь импорта пакета — это путь к его модулю, объединенный с его подкаталогом внутри модуля. Например, модуль github.com/google/go-cmp содержит пакет в каталоге cmp/. Путь импорта этого пакета github.com/google/go-cmp/cmp . Пакеты в стандартной библиотеке не имеют префикса пути к модулю.
Новые изменения модуля в Go 1.16:
Модули включены по умолчанию Команда go теперь по умолчанию создает пакеты в режиме с поддержкой модулей, даже если go.mod отсутствует. Это большой шаг к использованию модулей во всех проектах.
По-прежнему возможно создавать пакеты в режиме GOPATH, установив для переменной среды GO111MODULE значение off . Вы также можете установить для GO111MODULE значение auto, чтобы включить режим с поддержкой модуля, только если файл go.mod присутствует в текущем каталоге или любом родительском каталоге. Ранее это было по умолчанию. Обратите внимание, что вы можете установить GO111MODULE и другие переменные постоянно с помощью go env -w:
go env -w GO111MODULE=auto Мы планируем отказаться от поддержки режима GOPATH в Go 1.17. Другими словами, Go 1.17 будет игнорировать GO111MODULE. Если у вас есть проекты, которые не строятся в режиме с поддержкой модулей, сейчас самое время выполнить миграцию. Если есть проблема, препятствующая вашему переходу, пожалуйста, рассмотрите возможность подачи заявления о проблеме или отчета об опыте.
Для ясности — моя тестовая структура такова:
go version
go version go1.17.5 linux/amd64
Просто рабочий пример ( main.go
файл):
package main
import (
"myapp/db"
"myapp/webapp"
)
func main() {
database := db.New()
webapp.StartServer(amp;database, amp;notifierClient)
}
var notifierClient = "Test"
Отладочный вывод:
Комментарии:
1. Спасибо! это сработало. Мне также пришлось отключить модули, чтобы он начал искать в GOPATH: go env -w GO111MODULE=on, а затем снова = off
2. Пожалуйста, мой env таков:
GO111MODULE=""
и вам не нужно работать внутри $ GOPTH