Låt oss gå Golang Code Organization

Go är ett special språk bland moderna språk. Det är mycket åsikt. Det finns till exempel en sann formatering. Go kommer att berätta hur du rymmer din kod och var du ska sätta dina lockiga hängslen på. Men det går mycket djupare än det. 

Go kommer också att berätta hur du aktiverar dina funktioner och variabler för att göra dem offentliga eller privata. Det kommer att diktera katalogstrukturen för din kod. Detta kan komma som en överraskning för utvecklare som kommer till Go från mer liberala programmeringsspråk. 

I den här artikeln ska jag utforska några av Gos restriktioner, diskutera deras fördelar och föreslå alternativ för vanliga situationer.

Go är ett otroligt kraftfullt programmeringsspråk, lära allt från att skriva enkla verktyg för att bygga skalbara, flexibla webbservrar i hela vår kurs.

Projekt Euler

När jag började lära mig skapade jag en lösning på problem nr 6 och lade den bara i en underkatalog tillsammans med lösningar på andra problem på andra språk. Se Projekt Euler.

Problemet är att Go inte vill att du bara ska sprida Go-filer slumpmässigt överallt. Jag insåg senare att medan det fungerar i mycket enkla fall där du inte importerar andra paket, är det inte korrekt.

beroenden

Varje icke trivialt program består av flera filer eller moduler eller komponenter eller klasser. Jag använder bara "fil" som en allmän term. De grupperas ofta i bibliotek eller paket eller församlingar. Jag använder bara "paket" som en allmän term. Koden du skriver beror på kod i andra filer och paket. 

Du måste berätta för din kod hur man hittar de paket och filer för att kunna använda sin funktionalitet. Varje språk har sin egen term: import, inkludera, kräver. Jag använder bara "import" som en allmän term.

På vissa språk (eller språkspecifika verktyg) kan du också installera beroenden från ett fjärrpaketförteckning och installera dem i en vanlig lokal plats som du kan importera från.

På de flesta vanliga programmeringsspråk har du mycket frihet. I C / C ++ berättar du kompilatorn / länken där filerna och de statiska biblioteken är (med kommandoradsväxlar eller miljövariabler som INCLUDE_DIR). I Python kan du installera paket från PyPI med setup.py eller med pip från PyPI och fjärrkontrollkällor. Du importerar sedan baserat på sökvägen för sys.path-paketet.

Gångvägen

Gå, som alltid, är mer föreskrivande. Det kan förolämpa din kreativitet att du inte får så mycket att säga om var du ska placera saker, men i slutet av dagen spelar det ingen roll och det finns tillräckligt med flexibilitet för att tillgodose olika situationer.

Go kräver att du sätter din kod i en arbetsyta. En arbetsyta är bara en katalog med tre underkataloger: src, pkg och bin. Det rekommenderas att du behåller alla dina projekt under en enda arbetsyta. På så sätt kan de vara beroende av varandra och dela gemensamma paket från tredje part.

Notera: Jag arbetar för närvarande med Windows och använder PowerShell för många av de interaktiva exemplen. I följande avsnitt ville jag visa katalogstrukturen i min arbetsyta med hjälp av träd kommando. Windows har ett eget tree.exe-kommando, men det är väldigt begränsat (inga nivåer). Det är påstås ett fullsträckt trädkommando för Windows här

Men platsen var oåtkomlig. Jag slutade med att skjuta en Docker-behållare som kör Ubuntu, monterade min Go-arbetsytan som / docs / Go, och använder kommandot Linux för att visa det. Så var inte förvirrad om du ser en Linux-miljö som visar Windows-kataloger och filer med .exe-suffixer.

Här är min nuvarande Go-arbetsytan. De bin katalogen innehåller olika Go-kommandon / verktyg och delve debugger. De pkg dir har en underkatalog med plattformen (Win 64) som innehåller paket som organiseras av deras ursprung (github.com, golang.com, etc.). De src katalog har liknande underkataloger för ursprungsförvaret eller webbplatsen (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-sökrobot | | - golang | | - google | | - Lukehoban | | - multi-git | | - newhook | | - nsf | | - rogpeppe | | - tpng | '- x | - golang.org | '- x | - gopkg.in | '- alecthomas' - sourcegraph.com '- sqs 27 kataloger, 11 filer 

Låt oss ta en titt inuti ett av de källprojekt jag skapade under src: Go-web-sökroboten. Det är ganska enkelt här: bara en plattlista med Go-filer, en licens och en README-fil.

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

GOROT och GOPATH

Två miljövariabler styr ditt öde i Go Go. GOROOT är där Go-installationen är:

09:21:26 C: \ Users \ the_g \ Documents \ Go> En Env: \ GOROOT Namn Värde ---- ----- GOROOT C: \ Go \ 09:21:35 C: \ Users \ the_g \ Dokument \ Go> ls c: \ go Directory: C: \ go Mode LastWriteTime Längd Namn ---- ------------- ------ ---- d --- - 8/16/2016 10:38 api d ----- 8/16/2016 10:38 bin d ----- 8/16/2016 10:38 blogg d ----- 8/16/2016 10:38 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 FÖRSÖKARE -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 VERSION 

Observera att Go root-katalogen ser ut som en superset av en arbetsyta med src, bin och pkg-kataloger.

GOPATH pekar på din arbetsyta. Så hittar Go din kod.

09:21:53 C: \ Användare \ the_g \ Documents \ Go> ls Env: \ GOPATH Namnvärde ---- ----- GOPATH c: \ Users \ the_g \ Documents \ Go 

Det finns en massa andra Go-relaterade miljövariabler, varav många du var skyldiga att sätta i det förflutna (t.ex.. GÅS och GOARCH). Nu är de frivilliga, och du får inte röra med dem om du inte behöver verkligen (till exempel när du korsar samman). För att se alla Go-miljövariablerna, skriv: gå env.

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

Installerar och importerar

När du skapar ett Go-program eller ett bibliotek kan du installera det. Programmen går till din arbetsyta bin katalog och bibliotek går till arbetsytans pkg katalogen. På Windows upptäckte jag att din % GOPATH% / bin är inte i %VÄG% katalog, så Windows kunde inte hitta min körbar. Jag lade den till Windows PATH och allt fungerade. Så här kontrollerar du i PowerShell att din PATH innehåller din arbetsplats bin-katalog:

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

Låt oss se allt som är i aktion.

Om jag går till min go-web-sökrobot och skriver starta installationen sedan skapas go-web-crawler.exe i C: \ Users \ the_g \ Documents \ Go \ bin:

11:09:18 C: \ Användare \ the_g> ls $ env: GOPATH / bin Directory: C: \ Användare \ the_g \ Documents \ Go \ bin Läge LastWriteTime Längd Namn ---- --------- ---- ------ ---- -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 

Jag kan nu köra den från min Go web-sökrobot var som helst.

11:10:32 C: \ Users \ the_g> go-web-crawler.exe hittades: http://golang.org/ "Go Programming Language" hittades: http://golang.org/cmd/ "" inte hittade: http://golang.org/cmd/ hittade: http://golang.org/pkg/ "Paket" hittades: http://golang.org/pkg/os/ "Paket OS" hittades: http: / /golang.org/pkg/fmt/ "Package fmt" hittades: http://golang.org/ "Go Programming Language"

Flera Go Miljöer

Det är bra, men ibland är livet inte så enkelt. Du kanske vill ha flera separata arbetsytor. Dessutom kanske du vill ha flera installationer av Go (t.ex. olika versioner) och flera arbetsytor för var och en. Du kan göra detta genom att dynamiskt ställa in GOPATH för att ändra arbetsytan och inställningen GOROOT för att ändra den aktiva Go-installationen.

Det finns olika open source-projekt för försäljning, pakethantering och virtuella miljöer. Av någon anledning stöder de flesta inte Windows. Jag är inte säker på varför sådana verktyg måste vara plattformsspecifika. Jag kan skriva en plattforms-Go-miljöchef själv en av dessa dagar.

Slutsats

Go handlar om att eliminera oavsiktlig komplexitet. Ibland kommer det av som mycket strikt och förskrivande. Men om du kommer in i Go designers tankegångar börjar du förstå att undvika, förbjuda eller förordna vissa saker gör allting enklare.