La oss gå Golang Code Organization

Go er et spesialspråsmål blant moderne språk. Det er veldig opinionated. For eksempel er det en sann formatering. Go vil fortelle deg hvordan du plasserer koden din og hvor du skal sette dine krøllete braces. Men det går mye dypere enn det. 

Go vil også fortelle deg hvordan du skal kapitalisere dine funksjoner og variabler for å gjøre dem offentlige eller private. Det vil diktere katalogstrukturen til koden din. Dette kan komme som en overraskelse for utviklere som kommer til å gå fra mer liberale programmeringsspråk. 

I denne artikkelen vil jeg utforske noen av Gos restriksjoner, diskutere deres fordeler, og foreslå alternativer for vanlige situasjoner.

Go er et utrolig kraftig programmeringsspråk, lære alt fra å skrive enkle verktøy for å bygge skalerbare, fleksible webservere i hele kurset.

Prosjekt Euler

Da jeg begynte å lære Go, opprettet jeg en løsning på problem nr. 6, og bare sette den i en underkatalog sammen med løsninger på andre problemer på andre språk. Se Prosjekt Euler.

Problemet er at Go ikke vil at du bare skal spre Go-filer tilfeldig over alt. Jeg skjønte senere at mens det fungerer i svært enkle tilfeller der du ikke importerer andre pakker, er det ikke riktig.

avhengig

Hvert ikke-trivielt program består av flere filer eller moduler eller komponenter eller klasser. Jeg vil bare bruke "fil" som en generell betegnelse. De er ofte gruppert i biblioteker eller pakker eller forsamlinger. Jeg vil bare bruke "pakke" som en generell betegnelse. Koden du skriver, er avhengig av kode i andre filer og pakker. 

Du må fortelle koden din hvordan du finner de pakkene og filene for å kunne bruke funksjonaliteten. Hvert språk har sin egen betegnelse: Import, inkludere, krever. Jeg vil bare bruke "import" som en generell betegnelse.

Noen språk (eller språkspesifikke verktøy) tillater deg også å installere avhengigheter fra et eksternt pakkelager og installere dem i en standard lokal plassering du kan importere fra.

I de fleste vanlige programmeringsspråk har du mye frihet. I C / C ++ forteller du kompilatoren / linkeren hvor filene og statiske bibliotekene er (ved hjelp av kommandolinjebrytere eller miljøvariabler som INCLUDE_DIR). I Python kan du installere pakker fra PyPI ved hjelp av setup.py eller med pip fra PyPI og eksterne kildekontrollbeholdere. Du importerer deretter basert på sysepath-pakkesøkebanen.

The Go Way

Gå, som alltid, er mer reseptiv. Det kan fornærme din kreativitet at du ikke får så mye å si om hvor du skal plassere ting, men på slutten av dagen spiller det ingen rolle, og det er nok fleksibilitet til å imøtekomme ulike situasjoner.

Go krever at du setter koden i et arbeidsområde. Et arbeidsområde er bare en katalog med tre underkataloger: src, pkg og bin. Det anbefales at du beholder alle dine prosjekter under ett enkelt arbeidsområde. På denne måten kan de stole på hverandre og dele vanlige tredjepartspakker.

Merk: Jeg jobber for tiden på Windows og bruker PowerShell for mange av de interaktive eksemplene. I følgende avsnitt ønsket jeg å vise katalogstrukturen til arbeidsområdet mitt ved hjelp av tre kommando. Windows har sin egen tree.exe-kommando, men den er svært begrenset (ingen nivåer). Det er angivelig en fullverdig trekommando for Windows her

Men siden var ikke tilgjengelig. Jeg endte opp med å skyte en Docker-container som kjører Ubuntu, montere min Go-arbeidsområde som / docs / Go, og bruker Linux-kommandoen til å vise den. Så vær ikke forvirret hvis du ser et Linux-miljø som viser Windows-kataloger og filer med .exe-suffiks.

Her er mitt nåværende Go-arbeidsområde. De bin katalogen inneholder forskjellige Go-kommandoer / verktøy og delve debugger. De pkg dir har en underkatalog med plattformen (Win 64) som inneholder pakker organisert av opprinnelsen deres (github.com, golang.com, etc.). De src katalog har lignende underkataloger for opprinnelsesarkivet eller nettstedet (github.com, golang.org, etc.).

root @ 67bd4824f9d5: / docs / Go # tree -n -L 3 | - bin | | - dlv.exe | | - go-outline.exe | | - go-symbols.exe | | - gocode.exe | | - godf.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 kataloger, 11 filer 

La oss ta en titt inne i en av kildeprosjektene jeg opprettet under src: Go-web-crawleren. Det er ganske enkelt her: bare en flat liste over Go-filer, en lisens og en README-fil.

root @ 67bd4824f9d5: / docs / Gå # tree src / github.com / go-web-crawler / -n src / github.com / go-web-crawler / | - LISENS | | README.md | - channel_crawl .go | - main.go '- sync_map_crawl.go 0 kataloger, 5 filer

GOROT og GOPATH

To miljøvariabler styrer din skjebne i Goeland. GOROOT er hvor Go-installasjonen er:

09:21:26 C: \ Brukere \ the_g \ Documents \ Go> ls Env: \ GOROOT Navn Verdi ---- ----- GOROOT C: \ Go \ 09:21:35 C: \ Brukere \ the_g \ Dokumenter \ Go> ls c: \ go Directory: C: \ go Mode LastWriteTime Lengde Navn ---- ------------- ------ ---- d --- - 8/16/2016 10:38 api d ----- 8/16/2016 10:38 bin d ----- 8/16/2016 10:38 blog d ----- 8/16/2016 10:38 AM doc d ----- 8/16/2016 10:38 lib d ----- 8/16/2016 10:38 Misc d ----- 8 / 16/2016 10:38 pkg d ----- 8/16/2016 10:38 AM src d ----- 8/16/2016 10:38 test -a ---- 8/16 / 2016 1:48 PM 29041 AUTHORS -a ---- 8/16/2016 1:48 PM 1168 CONTRIBUT -a ---- 8/16/2016 1:48 PM 40192 CONTRIBUT -a ---- 8/16 / 2016 1:48 PM 1150 favicon.i -a ---- 8/16/2016 1:48 PM 1479 LICENSE -a ---- 8/16/2016 1:48 PM 1303 PATENTER -a ---- 8/16/2016 1:48 PM 1638 README.md -a ---- 8/16/2016 1:48 PM 26 robots.tx -a ---- 8/16/2016 1:48 PM 5 VERSJON 

Vær oppmerksom på at Go root-katalogen ser ut som en superset av et arbeidsområde med src, bin og pkg kataloger.

GOPATH peker på arbeidsområdet ditt. Slik finner du koden din.

09:21:53 C: \ Brukere \ the_g \ Documents \ Go> ls Env: \ GOPATH Navn Verdi ---- ----- GOPATH c: \ Brukere \ the_g \ Documents \ Go 

Det er en rekke andre Go-relaterte miljøvariabler, hvorav mange du måtte sette i fortiden (f.eks. GOOS og GOARCH). Nå er de valgfrie, og du bør ikke rote med dem med mindre du virkelig trenger (for eksempel når du krysser sammen). For å se alle Go-miljøvariablene, skriv: gå env.

09:51:10 C: \ Brukere \ the_g> go env sett GOARCH = amd64 sett GOBIN = sett GOEXE = .exe sett GOHOSTARCH = amd64 sett GOHOSTOS = windows sett GOOS = windows sett GOPATH = c: \ Brukere \ the_g \ Documents \ Gå inn GORACE = sett GOROOT = C: \ Gå sett GOTOOLDIR = C: \ Go \ pkg \ verktøy \ windows_amd64 sett CC = gcc sett GOGCCFLAGS = -m64 -mthreads -fmessage-length = 0 sett CXX = g ++ sett CGO_ENABLED = 1

Installerer og importerer

Når du oppretter et Go-program eller et bibliotek, kan du installere det. Programmene går til arbeidsområdet ditt bin katalog og biblioteker går til arbeidsområdet pkg katalogen. På Windows oppdaget jeg at din % GOPATH% / bin er ikke i %STI% katalog, slik at Windows ikke kunne finne kjørbarheten min. Jeg la den til Windows PATH og alt fungerte. Slik sjekker du inn PowerShell at PATH-filen inneholder arbeidsområdet bin-katalogen din:

10:56:19 C: \ Users \ the_g> $ env: path.split (";") | grep gå C: \ Go \ bin c: \ Users \ the_g \ Documents \ Go \ bin 

La oss se alt som er i aktion.

Hvis jeg går til min go-web-crawler katalog og skriver gå installert så blir go-web-crawler.exe opprettet i C: \ Users \ the_g \ Documents \ Go \ bin:

11:09:18 C: \ Brukere \ the_g> ls $ env: GOPATH / bin Directory: C: \ Brukere \ the_g \ Documents \ Go \ bin Modus LastWriteTime Lengde Navn ---- --------- ---- ------ ---- -a ---- 8/15/2016 11:05 15891456 dlv.exe -a ---- 8/15/2016 10:08 3972608 go -outline.exe -a ---- 8/15/2016 10:10 4502528 go-symbols.exe -a ---- 9/18/2016 10:14 1849856 go-web-crawler.exe -a ---- 8/15/2016 10:08 12097024 gocode.exe -a ---- 8/15/2016 10:17 6642688 godef.exe -a ---- 8/15/2016 9:32 AM 6625792 golint.exe -a ---- 8/15/2016 10:14 6352896 gometalinter.exe -a ---- 8/15/2016 10:10 2738688 gopkgs.exe -a ---- 8 / 15/2016 10:10 6961152 gorename.exe -a ---- 8/15/2016 10:09 7291904 goreturns.exe -a ---- 8/15/2016 10:11 9722368 guru.exe 

Jeg kan nå kjøre den fra min Go web crawler fra hvor som helst.

11:10:32 C: \ Users \ the_g> go-web-crawler.exe funnet: http://golang.org/ "Go Programming Language" funnet: http://golang.org/cmd/ "" ikke funnet: http://golang.org/cmd/ funnet: http://golang.org/pkg/ "Pakker" funnet: http://golang.org/pkg/os/ "Package os" funnet: http: / /golang.org/pkg/fmt/ "Package fmt" funnet: http://golang.org/ "Go Programming Language"

Flere Go Miljøer

Det er bra, men noen ganger er livet ikke så enkelt. Du vil kanskje ha flere separate arbeidsområder. I tillegg kan det hende du vil ha flere installasjoner av Go (for eksempel forskjellige versjoner) og flere arbeidsområder for hver enkelt. Du kan gjøre dette ved dynamisk innstilling GOPATH for å endre arbeidsområdet og innstillingen GOROOT for å endre den aktive Go-installasjonen.

Det finnes ulike open source-prosjekter for vendoring, pakkehåndtering og virtuelle miljøer. Av en eller annen grunn støtter de fleste ikke Windows. Jeg er ikke sikker på hvorfor slike verktøy må være plattformspesifikke. Jeg kan skrive en kryssplattform Go miljøleder meg selv en av disse dagene.

Konklusjon

Go handler om å eliminere tilfeldig kompleksitet. Noen ganger kommer det av som veldig strenge og reseptive. Men hvis du kommer inn i tankegangen til Go-designerne, begynner du å forstå at unngår, forbyder eller mandater bestemte ting virkelig gjør alt enklere.