2013-06-05 2 views
11

This Репо имеет 3 файла, все начинается с «пакетного пиломатериала». Чтобы использовать этот пакет, я должен поставить это в моем GOROOT и простоКак пакеты с несколькими файлами работают в golang?

import lumber 

в моей программе. Как переменные и типы в этом пакете соединяются друг с другом в нескольких файлах? Как компилятор go знает, какой файл начать читать первым?

В случае, если я хочу прочитать пакет, где я должен начать читать, чтобы понять пакет? Что именно здесь происходит?

+0

@elithrar: Не верно. Область видимости файла и область пакета - разные области. Например, импорт имеет только область пакета, поэтому сложение всех исходных файлов пакета вместе не работает в общем случае. – zzzz

+0

@jnml okay, поэтому его в основном, как и все файлы, объединены в один большой файл, с правилами области действия, указанными в ссылке, которую вы указали ниже, не так ли? – pymd

+0

@nomad: Я так не думаю. Спецификаторы импорта являются файлами и не могут быть воспроизведены путем присоединения файлов к одному. IOW, например, идентификатор 'template' может ссылаться на пакет 'text/template' в одном файле, но для пакета 'html/template' в другом файле. Эта область не может быть «поднята» до области пакета. – zzzz

ответ

15

Нет, вы не «Предположительно, чтобы положить это в мой GOROOT». Вы должны выполнить

$ go get github.com/jcelliott/lumber 

который будет клонировать репозиторий в $GOPATH/src/github.com/jcelliott/lumber. Затем вы можете использовать пакет, импортируя его в коде, как

import "github.com/jcelliott/lumber" 

О правилах определения объема: Declarations and scope

22

Чтобы уточнить ответ jnml в:

При использовании import "foo/bar" в вашем коде, вы не ссылаясь на исходные файлы (которые будут расположены в $GOPATH/src/foo/bar/).

Вместо этого вы ссылаетесь на скомпилированный файл пакета по адресу $GOPATH/pkg/$GOOS_$GOARCH/foo/bar.a. Когда вы создаете свой собственный код, и компилятор обнаруживает, что пакет foo/bar еще не скомпилирован (или устарел), он сделает это за вас автоматически.

Он делает это путем сопоставления всех соответствующих исходных файлов в каталоге $GOPATH/src/foo/bar и построения их в один файл bar.a, который он устанавливает в каталоге pkg. Затем компиляция возобновляется с вашей собственной программой.

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

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

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

+0

спасибо вам большое. Это действительно устранило много сомнений. – pymd