Как пакеты с несколькими файлами работают в 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. Затем компиляция возобновляется с вашей собственной программой.

Этот процесс повторяется для всех импортированных пакетов и пакетов, импортированных этими же, вплоть до цепочки зависимостей.

*) Как сортируются файлы, зависит от того, как назван файл и какие теги сборки присутствуют внутри него.

Для более глубокого понимания того, как это работает, обратитесь к