Go è una lingua speciale tra le lingue moderne. È molto supponente. Ad esempio, c'è una vera formattazione. Vai ti dirà come spaziare il tuo codice e dove mettere le tue parentesi graffe. Ma va molto più in profondità di quello.
Go ti dirà anche come capitalizzare le tue funzioni e variabili per renderle pubbliche o private. Detterà la struttura della directory del tuo codice. Ciò potrebbe sorprendere gli sviluppatori che vengono a passare da linguaggi di programmazione più liberali.
In questo articolo, esplorerò alcune delle restrizioni di Go, ne discuterò i meriti e suggerirò opzioni per situazioni comuni.
Go è un linguaggio di programmazione incredibilmente potente, impara tutto da scrivere semplici utility a costruire server web scalabili e flessibili nel nostro corso completo.
Quando ho iniziato a studiare Go, ho creato una soluzione al problema numero 6 e l'ho inserita in una sottodirectory insieme a soluzioni ad altri problemi in altre lingue. Vedi Project Euler.
Il problema è che Go non ti vuole solo spargere i file Go casualmente ovunque. In seguito mi sono reso conto che mentre funziona in casi molto semplici in cui non si importano altri pacchetti, non è corretto.
Ogni programma non banale è composto da più file o moduli o componenti o classi. Userò semplicemente "file" come termine generale. Spesso sono raggruppati in librerie o pacchetti o assiemi. Userò semplicemente "pacchetto" come termine generale. Il codice che scrivi dipende dal codice in altri file e pacchetti.
Devi dire al tuo codice come trovare quei pacchetti e file per usare le loro funzionalità. Ogni lingua ha il suo termine: import, include, require. Userò semplicemente "import" come termine generale.
Alcune lingue (o strumenti specifici della lingua) consentono anche di installare le dipendenze da un repository di pacchetti remoto e di installarle in una posizione locale standard che è possibile importare da.
Nella maggior parte dei linguaggi di programmazione comuni, hai molta libertà. In C / C ++, si dice al compilatore / linker dove si trovano i file e le librerie statiche (usando le opzioni della riga di comando o variabili di ambiente come INCLUDE_DIR). In Python, è possibile installare pacchetti da PyPI utilizzando setup.py o con pip da PyPI e repository di controllo dei sorgenti remoti. Quindi si importa in base al percorso di ricerca del pacchetto sys.path.
Vai, come sempre, è più prescrittivo. Può offendere la tua creatività che non si dica tanto su dove posizionare le cose, ma alla fine non importa, e c'è abbastanza flessibilità per adattarsi a varie situazioni.
Go richiede che tu inserisca il tuo codice in un'area di lavoro. Un workspace è solo una directory con tre sottodirectory: src, pkg e bin. Si consiglia di conservare tutti i progetti in un'unica area di lavoro. In questo modo possono dipendere l'uno dall'altro e condividere pacchetti di terze parti comuni.
Nota: Attualmente lavoro su Windows e utilizzo PowerShell per molti degli esempi interattivi. Per la sezione seguente, volevo mostrare la struttura delle directory del mio spazio di lavoro usando il albero
comando. Windows ha il proprio comando tree.exe, ma è molto limitato (nessun livello). È presumibilmente un comando ad albero completo per Windows Qui.
Ma il sito era irraggiungibile. Alla fine ho aperto un contenitore Docker con Ubuntu, ho montato il mio spazio di lavoro Go come / docs / Go e ho usato il comando dell'albero Linux per mostrarlo. Quindi non essere confuso se vedi un ambiente Linux che mostra directory e file di Windows con suffissi .exe.
Ecco il mio attuale spazio di lavoro Go. Il bidone
la directory contiene vari comandi / strumenti Go e il debugger delve. Il pkg
dir ha una sottodirectory con la piattaforma (Win 64) che contiene i pacchetti organizzati in base alla loro origine (github.com, golang.com, ecc.). Il src
la directory ha sottodirectory simili per il repository di origine o il sito Web (github.com, golang.org, ecc.).
root @ 67bd4824f9d5: / docs / Vai # tree -n -L 3 | - bin | | - dlv.exe | | - go-outline.exe | | - go-symbols.exe | | - gocode.exe | | - godef.exe | | - golint.exe | | - gometalinter.exe | | - gopkgs.exe | | - gorename.exe | | - goreturns.exe | '- guru.exe | - pkg | '- windows_amd64 | | - github.com | | - golang.org | | - gopkg.in | '- sourcegraph.com' - src | - github.com | | - alecthomas | | - derekparker | | - go-web-crawler | | - golang | | - google | | - lukehoban | | - multi-git | | - newhook | | - nsf | | - rogpeppe | | - tpng | '- x | - golang.org | '- x | - gopkg.in | '- alecthomas' - sourcegraph.com '- sqs 27 directory, 11 file
Diamo un'occhiata all'interno di uno dei progetti sorgente che ho creato sotto src
: il go-web-crawler. È piuttosto semplice qui: solo un elenco semplice di file Go, una licenza e un file README.
root @ 67bd4824f9d5: / docs / Vai # tree src / github.com / go-web-crawler / -n src / github.com / go-web-crawler / | - LICENZA | - README.md | - channel_crawl .go | - main.go '- sync_map_crawl.go 0 directory, 5 file
Due variabili d'ambiente controllano il tuo destino nella terra di Go. GOROOT
è dove si trova l'installazione di Go:
09:21:26 C: \ Users \ the_g \ Documents \ Go> ls Env: \ GOROOT Valore nome ---- ----- GOROOT C: \ Go \ 09:21:35 C: \ Users \ the_g \ Documents \ Go> ls c: \ go Directory: C: \ go Mode Cognome LastWriteTime Nome ---- ------------- ------ ---- d --- - 16/08/2016 10:38 api d ----- 16/08/2016 10:38 AM D ----- 8/16/2016 10:38 AM Blog d ----- 16/08/2016 10:38 AM Doc D ----- 8/16/2016 10:38 AM libd ----- 8/16/2016 10:38 AM misc d ----- 8 / 16/2016 10:38 pkg d ----- 16/08/2016 10:38 src d ----- 8/16/2016 10:38 AM test -a ---- 8/16 / 2016 13:48 29041 AUTORI -a ---- 16/08/2016 13:48 1168 CONTRIBUT -a ---- 16/08/2016 13:48 40192 CONTRIBUT -a ---- 8/16 / 2016 1:48 PM 1150 favicon.i -a ---- 16/08/2016 13:48 1479 LICENZA -a ---- 16/08/2016 13:48 1303 BREVETTI -a ---- 16/08/2016 1:48 PM 1638 README.md -a ---- 16/04/2016 13:48 26 robots.tx -a ---- 16/04/2016 13:48 VERSIONE 5
Si noti che la directory root di Go si presenta come un superset di un'area di lavoro con le directory src, bin e pkg.
GOPATH
punta al tuo spazio di lavoro. Ecco come Go trova il tuo codice.
09:21:53 C: \ Users \ the_g \ Documents \ Go> ls Env: \ GOPATH Nome Valore ---- ----- GOPATH c: \ Users \ the_g \ Documents \ Go
Ci sono un sacco di altre variabili d'ambiente relative a Go, molte delle quali dovevi impostare in passato (ad es. GOOS
e GOARCH
). Ora, sono opzionali e non dovresti fare confusione con loro a meno che tu non ne abbia davvero bisogno (ad es. Durante la compilazione incrociata). Per vedere tutte le variabili di ambiente Go, digitare: vai
.
09:51:10 C: \ Users \ the_g> go env set GOARCH = set amd64 GOBIN = set GOEXE = .exe set GOHOSTARCH = set amd64 GOHOSTOS = windows set GOOS = windows set GOPATH = c: \ Users \ the_g \ Documents \ Vai set GORACE = set GOROOT = C: \ Vai set GOTOOLDIR = C: \ Vai \ pkg \ tool \ windows_amd64 set CC = gcc set GOGCCFLAGS = -m64 -mthreads -fmessage-length = 0 set CXX = g ++ set CGO_ENABLED = 1
Quando si crea un programma Go o una libreria, è possibile installarlo. I programmi vanno nel tuo spazio di lavoro bidone
directory e le librerie vanno nell'area di lavoro pkg
directory. Su Windows, ho scoperto che il tuo % GOPATH% / bin
non è nel %SENTIERO%
directory, quindi Windows non ha trovato il mio eseguibile. L'ho aggiunto al PATH di Windows e tutto ha funzionato. Ecco come verificare in PowerShell che PATH contenga la directory del proprio spazio di lavoro:
10:56:19 C: \ Users \ the_g> $ env: path.split (";") | grep go C: \ Go \ bin c: \ Users \ the_g \ Documents \ Go \ bin
Vediamo tutto questo in azione.
Se vado nella mia directory go-web-crawler e digito vai all'installazione
quindi viene creato go-web-crawler.exe C: \ Users \ the_g \ Documenti \ Go \ bin
:
11:09:18 C: \ Users \ the_g> ls $ env: GOPATH / bin Directory: C: \ Users \ the_g \ Documents \ Go \ bin Mode Cognome LastWriteTime Nome ---- --------- ---- ------ ---- -a ---- 15/8/2016 11:05 AM 15891456 dlv.exe -a ---- 15/8/2016 10:08 AM 3972608 go -outline.exe -a ---- 15/8/2016 10:10 AM 4502528 go-symbols.exe -a ---- 18/09/2016 10:14 AM 1849856 go-web-crawler.exe -a ---- 15/8/2016 10:08 AM 12097024 gocode.exe -a ---- 15/8/2016 10:17 6642688 godef.exe -a ---- 15/08/2016 9:32 AM 6625792 golint.exe -a ---- 15/8/2016 10:14 AM 6352896 gometalinter.exe -a ---- 15/8/2016 10:10 AM 2738688 gopkgs.exe -a ---- 8 / 15/2016 10:10 AM 6961152 gorename.exe -a ---- 15/8/2016 10:09 AM 7291904 goreturns.exe -a ---- 15/8/2016 10:11 AM 9722368 guru.exe
Ora posso eseguirlo dal mio web crawler Go da qualsiasi luogo.
11:10:32 C: \ Users \ the_g> go-web-crawler.exe trovato: http://golang.org/ "Il linguaggio di programmazione Go" trovato: http://golang.org/cmd/ "" non trovato: http://golang.org/cmd/ found: http://golang.org/pkg/ "Pacchetti" trovati: http://golang.org/pkg/os/ "Pacchetto os" trovato: http: / /golang.org/pkg/fmt/ "Pacchetto fmt" trovato: http://golang.org/ "Il linguaggio di programmazione Go"
Va bene, ma a volte la vita non è così semplice. Potresti voler avere più spazi di lavoro separati. Inoltre, potresti voler installare più installazioni di Go (ad esempio versioni diverse) e più spazi di lavoro per ciascuna di esse. Puoi farlo impostando dinamicamente GOPATH
per cambiare lo spazio di lavoro e l'impostazione GOROOT
per cambiare l'installazione attiva di Go.
Esistono vari progetti open source per la vendita, la gestione dei pacchetti e gli ambienti virtuali. Per qualche ragione, la maggior parte non supporta Windows. Non sono sicuro del motivo per cui tali strumenti devono essere specifici della piattaforma. Potrei scrivere io stesso un gestore dell'ambiente Go multipiattaforma uno di questi giorni.
Go si occupa di eliminare la complessità accessoria. A volte risulta molto severo e prescrittivo. Ma se entri nella mentalità dei designer di Go, inizi a capire che evitare, vietare o imporre certe cose rende davvero tutto più semplice.