Кто-нибудь может объяснить, почему GOPATH удобен и как его следует использовать в общем?
Я новичок в языке программирования Go, и каждый учебник начинается с настройки переменной окружения GOPATH для текущей папки проекта.
Неужели я что-то упускаю? Разве программист действительно должен вручную настраивать GOPATH каждый раз, когда он переходит в новую папку проекта с помощью команды cd
? Я прочитал несколько записей в разделе FAQ о GOPATH, но так и не смог в этом разобраться.
И какая тогда роль переменной GOROOT? Для чего она нужна?
Существуют ли какие-нибудь автоматические инструменты, которые могут определить, находится ли текущая директория в корне проекта Go (например, по наличию какого-то скрытого файла), и автоматически устанавливать GOPATH на эту директорию?
Спасибо, буду благодарен за любые советы!
P.S. Например, если я разрабатываю совершенно независимые проекты Go A, B и C, должны ли они находиться в одной "рабочей" среде? Я думаю, что нет, но что тогда делать с GOPATH и GOROOT?
1 ответ(ов)
Цель переменной окружения GOPATH
заключается в том, чтобы централизовать все пакеты в одном общем рабочем пространстве. Это не совсем новая концепция (вспомните, например, класс-путь Java), но использование GOPATH
в Go значительно упрощается за счет отсутствия поддержки версий пакетов.
Программист Go не должен устанавливать GOPATH
вручную при входе в новую папку проекта. Каждая папка проекта должна рассматриваться как отдельный пакет и находиться в GOPATH
вместе с другими пакетами, поэтому GOPATH
следует устанавливать только один раз. В учебниках начинают с установки GOPATH
, чтобы изолировать рабочее пространство от всего остального (или просто предполагая, что пользователь еще не установил GOPATH
).
Переменная GOROOT
устанавливается для предоставления стандартных пакетов программисту Go, и вам не нужно с ней ничего делать. Вкратце, есть одно главное правило для GOROOT
: никогда, ни при каких обстоятельствах не трогайте ее. Не устанавливайте в нее ничего, не модифицируйте стандартные пакеты и т. д.
Я не знаю инструмента для обнаружения проектов Go в текущей директории, но, думаю, создать его не должно быть слишком сложно.
Как вы будете управлять разными проектами — это уже на ваше усмотрение. "Go-способ" заключается в том, чтобы помещать каждый проект как пакет в директорию $GOPATH/src
и делать все оттуда. Так как мне это не очень нравится, я определил свой GOPATH
как $HOME/.go
. Затем я помещаю каждый проект в отдельную директорию где-то еще (в любом месте на своем компьютере) и создаю символическую ссылку на директорию проекта в свою директорию $GOPATH/src
. Таким образом, я могу использовать любые команды инструментов Go (например, go build myproject
), использовать проект в качестве пакета для другого и т. д.
Существует ли цикл foreach в Go?
Как сопоставить любой символ на нескольких строках в регулярном выражении?
Отформатировать строку в Go без вывода?
Есть ли способ получить доступ к приватным полям структуры из другого пакета?
Получение тега поля структуры с использованием пакета reflect в Go