Как пакеты с несколькими файлами работают в golang?
Этот repo имеет 3 файла go, все начинается с "package lumber".
Чтобы использовать этот пакет, я должен положить его в свой GOROOT
и просто
import lumber
в моей программе. Как переменные и типы в этом пакете соединяются друг с другом в нескольких файлах? Как компилятор go знает, какой файл начать читать первым?
В случае, если я хочу прочитать пакет, где я должен начать читать, чтобы понять пакет? Что такое поток вещей здесь?
Ответы
Ответ 1
Нет, вы не "должны помещать это в свой GOROOT". Вы должны выполнить
$ go get github.com/jcelliott/lumber
который клонирует репозиторий в $GOPATH/src/github.com/jcelliott/lumber
. Затем вы можете использовать пакет, импортировав его в свой код как
import "github.com/jcelliott/lumber"
О правилах охвата: Объявления и область применения
Ответ 2
Чтобы уточнить ответ jnml:
Когда вы используете import "foo/bar"
в своем коде, вы не имеете в виду исходные файлы (которые будут расположены в $GOPATH/src/foo/bar/
).
Вместо этого вы ссылаетесь на файл скомпилированного пакета в $GOPATH/pkg/$GOOS_$GOARCH/foo/bar.a
. Когда вы создаете свой собственный код, и компилятор обнаруживает, что пакет foo/bar
еще не скомпилирован (или устарел), он сделает это за вас автоматически.
Он делает это, сопоставляя * все соответствующие исходные файлы в каталоге $GOPATH/src/foo/bar
и создавая их в один файл bar.a
, который он устанавливает в каталоге pkg. Затем компиляция возобновляется с вашей собственной программой.
Этот процесс повторяется для всех импортированных пакетов и пакетов, импортированных этими же, вплоть до цепочки зависимостей.
*) Как сортируются файлы, зависит от того, как назван файл и какие теги сборки присутствуют внутри него.
Для более глубокого понимания того, как это работает, обратитесь к