tgoop.com/golang_interview/230
Last Update:
Модуль - это дерево пакетов. Имя модуля задаётся в go.mod
Пакет - это набор исходных .go файлов, находящихся в одном каталоге и с одинаковой директивой package.
Файлы для одного пакета обязаны находиться в одном каталоге. Полное имя для пакета строится из имени модуля и пути к каталогу с файлами. Например,
в go.mod написано module example.org/mylib, тогда все пакеты из модуля example.org/mylib должны быть в дочерних каталогах относительно go.mod.
и путь к каталогу определяет имя пакета.
Например, в дереве исходников вашей библиотеки есть файлы в каталоге ./cmd/root.
Тогда эти файлы должны быть либо с директивой package root, либо package root_test. И полное имя пакета для этих файлов будет либо example.org/mylib/cmd/root, либо example.org/mylib/cmd/root_test[1].
Для автоматического поиска пакетов в Гугле придумали протокол goproxy Он реализован в GitHub, поэтому любой модуль, размещённый там, автоматически будет найден командами go get, go mod tidy, go build и подобными.
Но никто не ограничивает вас пользоваться только гитхабом. К примеру, поддержка goproxy есть в GitLab. Разворачиваете у себя на сервере гитлаб, настраиваете домены и прокси - и готово, go get начинает находить модули с вашим доменным именем.
На худой конец можно развернуть исходники стороннего модуля у себя в файловой системе, а в go.mod прописать зависимость с replace:
require example.org/some/module v1.01.02
replace example.org/some/module => ../some_module_src
В этом случае go build вообще не полезет в интернет, а возьмёт исходники модуля example.org/some/module из каталога ../some_module_src
[1] Пакет example.org/mylib/cmd/root_test
должен содержать тесты для пакета example.org/mylib/cmd/root
#junior
@golang_interview