2013-06-05 14 views
11

This repo ha 3 file go tutti iniziano con "pacchetto legname". Per utilizzare questo pacchetto, dovrei mettere questo nel mio GOROOT e semplicementeCome funzionano i pacchetti con più file in golang?

import lumber 

nel mio programma. In che modo le variabili e i tipi in questo pacchetto si connettono tra loro su più file? Come fa il compilatore go a sapere quale file iniziare a leggere per primo?

Nel caso volessi leggere il pacchetto, dove dovrei iniziare a leggere per capire il pacchetto? Che cosa è esattamente il flusso delle cose qui?

+0

@elithrar: non vero. L'ambito del file e l'ambito del pacchetto sono ambiti diversi. Ad esempio, le importazioni hanno solo un ambito del pacchetto, quindi la catalogazione di tutti i file di origine di un pacchetto non funziona nel caso generale. – zzzz

+0

@jnml okay, quindi è fondamentalmente come se tutti i file fossero concatenati in un singolo file di grandi dimensioni, con le regole dell'ambito specificate nel link che hai fornito qui sotto, giusto? – pymd

+0

@nomad: non credo. I qualificatori di importazione sono ambiti e non possono essere riprodotti unendo i file in uno solo. IOW, ad esempio, l'identificatore 'template' può riferirsi al pacchetto 'text/template' in un file, ma al pacchetto 'html/template' in un altro file. Questo ambito non può essere "sollevato" nell'ambito del pacchetto. – zzzz

risposta

15

No, non sei "si suppone di mettere questo nel mio GOROOT". Si suppone di eseguire

$ go get github.com/jcelliott/lumber 

che clonare il repository nei $GOPATH/src/github.com/jcelliott/lumber. Quindi è possibile utilizzare il pacchetto importando nel vostro codice come

import "github.com/jcelliott/lumber" 

sulle regole di scoping: Declarations and scope

22

Per approfondire la risposta di jnml:

Quando si utilizza import "foo/bar" nel codice, si è non si riferisce ai file di origine (che si troveranno in $GOPATH/src/foo/bar/).

Invece, si fa riferimento a un file di pacchetto compilato a $GOPATH/pkg/$GOOS_$GOARCH/foo/bar.a. Quando si crea il proprio codice e il compilatore scopre che il pacchetto foo/bar non è stato ancora compilato (o non è aggiornato), lo farà automaticamente.

Fa ciò raccogliendo * tutti i file sorgente rilevanti nella directory $GOPATH/src/foo/bar e li costruisce in un singolo file bar.a, che installa nella directory pkg. La compilazione quindi riprende con il tuo programma.

Questo processo viene ripetuto per tutti i pacchetti importati e per i pacchetti importati da questi, fino in fondo alla catena di dipendenze.

*) Il modo in cui i file vengono fascicolati, dipende da come viene chiamato il file stesso e dal tipo di tag di build presenti al suo interno.

Per una comprensione più approfondita di come funziona, fare riferimento a build docs.

+0

grazie mille. Questo ha chiarito molti dubbi. – pymd

Problemi correlati