Let's Go Golang Code Organization

Go is een speciale taal onder moderne talen. Het is zeer eigenzinnig. Er is bijvoorbeeld één echte opmaak. Go zal je vertellen hoe je je code kunt plaatsen en waar je accolades moeten worden geplaatst. Maar het gaat veel dieper dan dat. 

Go zal u ook vertellen hoe u uw functies en variabelen kunt kapitaliseren om ze openbaar of privé te maken. Het dicteert de directorystructuur van uw code. Dit kan een verrassing zijn voor ontwikkelaars die vanuit meer liberale programmeertalen naar Go komen. 

In dit artikel zal ik enkele beperkingen van Go onderzoeken, hun verdiensten bespreken en opties voor veel voorkomende situaties voorstellen.

Go is een ongelooflijk krachtige programmeertaal, leer alles van het schrijven van eenvoudige hulpprogramma's tot het bouwen van schaalbare, flexibele webservers in onze volledige cursus.

Project Euler

Toen ik Go begon te leren, maakte ik een oplossing voor probleem 6 en stopte het in een submap naast oplossingen voor andere problemen in andere talen. Zie Project Euler.

Het probleem is dat Go niet wil dat je Go-bestanden willekeurig overal verspreidt. Later besefte ik dat hoewel het werkt in zeer eenvoudige gevallen waarin je geen andere pakketten importeert, het niet juist is.

afhankelijkheden

Elk niet-triviaal programma is samengesteld uit meerdere bestanden of modules of componenten of klassen. Ik gebruik gewoon "bestand" als een algemene term. Ze worden vaak gegroepeerd in bibliotheken of pakketten of samenstellingen. Ik gebruik gewoon 'pakket' als algemene term. De code die u schrijft, is afhankelijk van de code in andere bestanden en pakketten. 

U moet uw code vertellen hoe u die pakketten en bestanden kunt vinden om hun functionaliteit te gebruiken. Elke taal heeft zijn eigen term: importeren, opnemen, vereisen. Ik gebruik gewoon 'importeren' als algemene term.

Sommige talen (of taalspecifieke hulpprogramma's) stellen u ook in staat om afhankelijkheden van een externe pakketrepository te installeren en ze te installeren op een standaard lokale locatie die u kunt importeren uit.

In de meeste gangbare programmeertalen heeft u veel vrijheid. In C / C ++ vertel je de compiler / linker waar de bestanden en statische bibliotheken zich bevinden (met behulp van opdrachtregelopties of omgevingsvariabelen zoals INCLUDE_DIR). In Python kun je pakketten installeren vanuit PyPI met behulp van setup.py of met pip van PyPI en externe repository's voor bronbeheer. U importeert vervolgens op basis van het zoekpad van het sys.path-pakket.

The Go Way

Ga zoals altijd meer prescriptief. Het kan je creativiteit beledigen dat je niet zo veel zegt over waar je dingen moet plaatsen, maar uiteindelijk doet het er niet echt toe, en is er genoeg flexibiliteit om verschillende situaties aan te kunnen..

Go vereist dat je je code in een werkruimte plaatst. Een werkruimte is slechts een map met drie submappen: src, pkg en bin. Het wordt aanbevolen dat u al uw projecten onder één werkruimte houdt. Op deze manier kunnen ze van elkaar afhankelijk zijn en gemeenschappelijke pakketten van derden delen.

Notitie: Ik werk momenteel op Windows en gebruik PowerShell voor veel van de interactieve voorbeelden. Voor de volgende sectie wilde ik de directorystructuur van mijn werkruimte weergeven met behulp van de boom commando. Windows heeft zijn eigen opdracht tree.exe, maar deze is erg beperkt (geen niveaus). Er is naar verluidt een volledige tree-opdracht voor Windows hier

Maar de site was onbereikbaar. Uiteindelijk heb ik een Docker-container met Ubuntu afgevuurd, mijn Go-werkruimte als / docs / Go gemonteerd en het Linux-boomcommando gebruikt om het te tonen. Dus wees niet in de war als je een Linux-omgeving ziet met Windows-mappen en -bestanden met .exe-achtervoegsels.

Hier is mijn huidige Go-werkruimte. De bak map bevat verschillende Go-opdrachten / tools en het delve-debugger. De pkg dir heeft een submap met het platform (Win 64) dat de pakketten bevat die zijn georganiseerd op basis van hun oorsprong (github.com, golang.com, enz.). De src directory heeft vergelijkbare sub-directories voor de origin repository of website (github.com, golang.org, etc.).

root @ 67bd4824f9d5: / docs / Go # 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 | | - nieuwhaak | | - nsf | | - rogpeppe | | - tpng | '- x | - golang.org | '- x | - gopkg.in | '- alecthomas' - sourcegraph.com '- sqs 27 directory's, 11 bestanden 

Laten we een kijkje nemen in een van de bronprojecten die ik heb gemaakt onder src: de go-webcrawler. Het is vrij eenvoudig hier: slechts een platte lijst met Go-bestanden, een licentie en een README-bestand.

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 mappen, 5 bestanden

GOROOT en GOPATH

Twee omgevingsvariabelen bepalen uw bestemming in het land van Go. GOROOT is waar de Go-installatie is:

09:21:26 C: \ Users \ the_g \ Documents \ Go> ls Env: \ GOROOT Naam Waarde ---- ----- GOROOT C: \ Go \ 09:21:35 C: \ Users \ the_g \ Documents \ Go> ls c: \ go Directory: C: \ go Mode LastWriteTime Length Name ---- ------------- ------ ---- d --- - 8/16/2016 10:38 AM api d ----- 16-08-2016 10:38 bin bin ----- 8/16/2016 10:38 AM blog d ----- 16-8-2016 10:38 uur doc d ----- 8/16/2016 10:38 uur lib d ----- 8/16/2016 10:38 uur misc d ----- 8 / 16/2016 10:38 uur pkg d ----- 8/16/2016 10:38 uur src d ----- 8/16/2016 10:38 uur test -a ---- 8/16 / 2016 1:48 PM 29041 AUTEURS -een ---- 8/16/2016 1:48 PM 1168 CONTRIBUT -een ---- 8/16/2016 1:48 PM 40192 CONTRIBUT -een ---- 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 PATENTS -a ---- 16-8-2016 1:48 PM 1638 README.md -a ---- 8/16/2016 1:48 PM 26 robotstx -a ---- 8/16/2016 1:48 PM 5 VERSION 

Houd er rekening mee dat de Go-hoofddirectory eruitziet als een superset van een werkruimte met de src-, bin- en pkg-directory's.

GOPATH wijst naar je werkruimte. Dat is hoe Go jouw code vindt.

09:21:53 C: \ Users \ the_g \ Documents \ Go> ls Env: \ GOPATH Name Value ---- ----- GOPATH c: \ Users \ the_g \ Documents \ Go 

Er zijn een heleboel andere Go-gerelateerde omgevingsvariabelen waarvan er veel in het verleden moesten worden ingesteld (bijv. GOOS en GOARCH). Nu zijn ze optioneel, en je zou er niet mee moeten knoeien tenzij je het echt nodig hebt (bijvoorbeeld bij het cross-compileren). Als u alle Go-omgevingsvariabelen wilt zien, typt u: ga env.

09:51:10 C: \ Users \ the_g> go 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 \ Go set GORACE = set GOROOT = C: \ Go set GOTOOLDIR = C: \ Go \ pkg \ tool \ windows_amd64 set CC = gcc set GOGCCFLAGS = -m64 -mthreads -fmessage-length = 0 set CXX = g ++ set CGO_ENABLED = 1

Installeert en importeert

Wanneer u een Go-programma of een bibliotheek maakt, kunt u het installeren. Programma's gaan naar uw werkruimtes bak directory en bibliotheken gaan naar de werkruimtes pkg directory. Op Windows ontdekte ik dat jouw % GOPATH% / bin is niet in de %PAD% directory, zodat Windows mijn uitvoerbaar bestand niet kon vinden. Ik heb het toegevoegd aan Windows PATH en alles werkte. Hier leest u hoe u in PowerShell kunt controleren of uw PATH uw werkruimte-bin-map bevat:

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

Laten we dat allemaal in actie zien.

Als ik naar mijn go-web-crawler-map ga en typ ga installeren dan wordt go-web-crawler.exe gemaakt in c: \ Users \ the_g \ Documents \ Go \ bin:

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

Ik kan het nu vanaf elke plek vanaf mijn Go webcrawler uitvoeren.

11:10:32 C: \ Users \ the_g> go-web-crawler.exe gevonden: http://golang.org/ "The Go Programming Language" gevonden: http://golang.org/cmd/ "" niet gevonden: http://golang.org/cmd/ gevonden: http://golang.org/pkg/ "Pakketten" gevonden: http://golang.org/pkg/os/ "Pakket os" gevonden: http: / /golang.org/pkg/fmt/ "Package fmt" gevonden: http://golang.org/ "The Go Programming Language"

Meerdere Go-omgevingen

Dat is allemaal goed, maar soms is het leven niet zo eenvoudig. Misschien wilt u meerdere afzonderlijke werkruimten hebben. Bovendien wilt u wellicht meerdere Go-installaties (bijvoorbeeld verschillende versies) en meerdere werkruimten voor elke versie. U kunt dit doen door dynamisch in te stellen GOPATH voor het wijzigen van de werkruimte en de instelling GOROOT voor het wijzigen van de actieve Go-installatie.

Er zijn verschillende open-sourceprojecten voor vendoring, pakketbeheer en virtuele omgevingen. Om de een of andere reden ondersteunen de meesten Windows niet. Ik weet niet zeker waarom dergelijke tools platformspecifiek moeten zijn. Ik zou zelf een van de dagen een platformonafhankelijke Go-omgevingsmanager kunnen schrijven.

Conclusie

Go gaat helemaal over het elimineren van incidentele complexiteit. Soms komt het af als zeer streng en prescriptief. Maar als je in de mindset van de Go-ontwerpers komt, begin je te begrijpen dat het vermijden, verbieden of verplicht stellen van bepaalde dingen echt alles eenvoudiger maakt.