Să mergem Organizația Codului Golang

Go este o limbă specială în limbile moderne. Este foarte socotit. De exemplu, există o formatare adevărată. Go vă va spune cum să vă spațiu codul și în cazul în care pentru a pune bretele dvs. curly. Dar merge mult mai profund decât asta. 

Du-te, de asemenea, vă va spune cum să valorificați funcțiile și variabilele pentru a le face publice sau private. Acesta va dicta structura de directoare a codului. Acest lucru poate fi o surpriză pentru dezvoltatorii care vin să meargă din limbi de programare mai liberale. 

În acest articol, voi explora câteva restricții ale lui Go, le voi discuta despre meritele lor și voi sugera opțiuni pentru situații comune.

Go este un limbaj de programare incredibil de puternic, învățați totul, de la scrierea de utilități simple la construirea de servere web scalabile și flexibile în întregime.

Proiectul Euler

Când am început să învăț Go, am creat o soluție la Problema # 6 și am pus-o într-un sub-director alături de soluții la alte probleme din alte limbi. Vezi Proiectul Euler.

Problema este că Go nu dorește să împrăștii fișiere Go în mod aleatoriu peste tot. Mai târziu am realizat că, în timp ce funcționează în cazuri foarte simple în care nu importați alte pachete, nu este corect.

dependenţe

Fiecare program non-trivial este compus din mai multe fișiere sau module sau componente sau clase. Voi folosi doar "fișier" ca termen general. Ele sunt adesea grupate în biblioteci sau pachete sau întruniri. Voi folosi doar "pachetul" ca termen general. Codul pe care îl scrieți depinde de codul din alte fișiere și pachete. 

Trebuie să spuneți codul dvs. cum să găsiți acele pachete și fișiere pentru a le utiliza funcționalitatea. Fiecare limbă are propriul termen: import, include, cere. Voi folosi doar "import" ca termen general.

Unele limbi (sau unelte specifice limbii) vă permit de asemenea să instalați dependențele dintr-un depozit de pachete la distanță și să le instalați într-o locație locală standardă pe care să o importați.

În cele mai comune limbi de programare, aveți o mulțime de libertate. În C / C ++, spuneți compilatorului / linkerului unde sunt fișierele și bibliotecile statice (folosind comutatoare de linie de comandă sau variabile de mediu ca INCLUDE_DIR). În Python, puteți instala pachete din PyPI utilizând setup.py sau cu pip din PyPI și din depozitele de control de la distanță. Importați apoi pe baza căii de căutare sys.path.

Călătoria

Du-te, ca întotdeauna, este mai prescriptivă. S-ar putea să vă jigniți creativitatea, încât să nu obțineți cât de multe vorbe despre locul de plasare a lucrurilor, dar la sfârșitul zilei nu prea contează și există suficientă flexibilitate pentru a se potrivi diferitelor situații.

Mergeți pentru a vă pune codul într-un spațiu de lucru. Un spațiu de lucru este doar un director cu trei sub-directoare: src, pkg și bin. Se recomandă păstrarea tuturor proiectelor dvs. într-un singur spațiu de lucru. În acest fel, acestea pot depinde unul de celălalt și pot partaja pachete terțe comune.

Notă: În prezent lucrez pe Windows și folosesc PowerShell pentru multe dintre exemplele interactive. Pentru următoarea secțiune, am vrut să afișez structura de directoare a spațiului meu de lucru folosind copac comanda. Windows are propria comandă tree.exe, dar este foarte limitată (fără nivele). Există o presupusă comandă de copaci pentru Windows aici

Dar site-ul a fost inaccesibil. Am ajuns să trag un container Docker care rulează Ubuntu, să-mi montez spațiul de lucru Go ca / ​​docs / Go și să folosesc comanda arborescentă Linux pentru ao arăta. Deci, nu vă confundați dacă vedeți un mediu Linux care prezintă directoare Windows și fișiere cu sufixe .exe.

Aici este spațiul meu de lucru curent Go. cos directorul conține diverse comenzi / instrumente Go, și programul de depanare delve. PKG dir are un sub-director cu platforma (Win 64) care conține pachetele organizate după originea lor (github.com, golang.com, etc.). src directorul are sub-directoare similare pentru repozitoriul de origine sau site-ul web (github.com, golang.org, etc.).

root @ 67bd4824f9d5: / docs / Du-te # 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 | | --Gothub.com | - golang.org | | - gopkg.in | '- sourcegraph.com' - src | - github.com | | - alectoame | | - derekparker | | - Muzica | - Golang. | | - Google | | - Lukehoban | - multi-git | - newhook | | - nsf | - rogpeppe | | - tpng | '- x | - golang.org | "- x | - gopkg.in | '- alecthomas' - sourcegraph.com '- 27 de directoare, 11 fișiere 

Să aruncăm o privire în interiorul unuia dintre proiectele sursă create de mine src: crawler-ul web. Este destul de simplu aici: doar o listă plană de fișiere Go, o licență și un fișier README.

root @ 67bd4824f9d5: / docs / Go # tree src / github.com / go-web-crawler / -n src / github.com / go-web-crawler / - LICENȚĂ | - README.md | .go | - main.go '- sync_map_crawl.go 0 directoare, 5 fișiere

GOROOT și GOPATH

Două variabile de mediu controlează destinul tău în țara Go. GOROOT este locul unde instalarea Go este:

09:21:26 C: \ Users \ the_g \ Documents \ Go \ ls Env: \ GOROOT Nume Valoare ---- ----- GOROOT C: \ Go \ 09:21:35 C: \ Users \ the_g \ Documente \ Go> ls c: \ go Director: C: \ go Modul LastWriteTime Lungime Nume ---- ------------- ------ ---- d --- - 8/16/2016 10:38 AM api d ----- 8/16/2016 10:38 bin d ----- 8/16/2016 10:38 AM blog d ----- 8/16/2016 10:38 AM doc d ----- 8/16/2016 10:38 am lib d ----- 8/16/2016 10:38 AM misc d ----- 8 / 16/2016 10:38 AM pkg d ----- 8/16/2016 10:38 AM src d ----- 8/16/2016 10:38 test -a ---- 8/16 / 2016 1:48 PM 29041 AUTORI -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 LICENȚĂ -a ---- 8/16/2016 1:48 PM 1303 PATENTE -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 VERSIUNE 

Rețineți că directorul rădăcină Go arată ca un superset al unui spațiu de lucru cu directoarele src, bin și pkg.

GOPATH indică spre spațiul dvs. de lucru. Așa merge Go găsește codul tău.

09:21:53 C: \ Users \ the_g \ Documents \ Go \ ls Env: \ GOPATH Nume Valoare ---- ----- GOPATH c: \ Users \ the_g \ Documents \ Go 

Există o grămadă de alte variabile legate de mediul Go, multe dintre care ați fost obligate să setați în trecut (de ex. GOOS și GOARCH). Acum, ele sunt opționale și nu trebuie să le dezorientați dacă nu aveți nevoie de ele (de exemplu, atunci când încrucișați). Pentru a vedea toate variabilele de mediu Go, tastați: du-te env.

09:51:10 C: \ Utilizatorii \ the_g> Puneți env setul GOARCH = setul amd64 GOBIN = setul GOEXE = setul .exe GOHOSTARCH = setul amd64 GOHOSTOS = setul de ferestre GOOS = setul de ferestre GOPATH = c: \ Users \ the_g \ Documents \ Setați setul GORACE = setul GOROOT = C: \ Go setul GOTOOLDIR = setul C: \ Go \ pkg \ tool \ windows_amd64 setul CC = gcc setul GOGCCFLAGS = -m64 -mthreads -fmessage-length = 0 setul CXX = g ++ setul CGO_ENABLED = 1

Instalări și importuri

Când creați un program Go sau o bibliotecă, îl puteți instala. Programele merg în spațiul dvs. de lucru cos directorul și bibliotecile merg la spațiul de lucru PKG director. Pe Windows, am descoperit că dvs. % GOPATH% / bin nu este în %CALE% , astfel încât Windows nu a putut găsi executabilul meu. L-am adăugat la Windows PATH și totul a mers. Iată cum puteți verifica în PowerShell că PATH conține directorul dvs. de binar pentru spațiul de lucru:

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

Să vedem toate acestea în acțiune.

Dacă mă duc la directorul meu de navigare pe internet și scriu mergeți instalat apoi go-web-crawler.exe este creat în c: \ Users \ the_g \ Documents \ Go \ bin:

11:09:18 C: \ Users \ the_g> ls $ env: GOPATH / bin Director: C: \ Utilizatori \ the_g \ Documents \ Go \ bin Modul LastWriteTime Nume lungime ---- --------- ---- ------ ---- -a ---- 8/15/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 ---- 9/18/2016 10:14 AM 1849856 go-web-crawler.exe -a ---- 8/15/2016 10:08 AM 12097024 gocode.exe -a ---- 8/15/2016 10:17 AM 6642688 godef.exe -a ---- 8/15/2016 9:32 AM 6625792 golint.exe -a ---- 8/15/2016 10:14 AM 6352896 gometalinter.exe -a ---- 8/15/2016 10:10 AM 2738688 gopkgs.exe -a ---- 8 / 15/2016 10:10 AM 6961152 gorename.exe -a ---- 8/15/2016 10:09 AM 7291904 goreturns.exe -a ---- 8/15/2016 10:11 AM 9722368 guru.exe 

Acum o pot rula de pe crawler-ul meu de pe Go de oriunde.

11:10:32 C: \ Users \ the_g> Go-web-crawler.exe găsit: http://golang.org/ "Limbajul de programare Go" găsit: http://golang.org/cmd/ "" nu găsită: http://golang.org/cmd/ găsit: http://golang.org/pkg/ "Pachete" găsite: http://golang.org/pkg/os/ "Pachet os" găsit: http: /golang.org/pkg/fmt/ "Pachetul fmt" găsit: http://golang.org/ "The Go Programming Language"

Medii Multi Go

Asta e bine, dar uneori viața nu este atât de simplă. Poate doriți să aveți mai multe spații de lucru separate. În plus, este posibil să doriți să aveți mai multe instalări de Go (de ex. Versiuni diferite) și mai multe spații de lucru pentru fiecare. Puteți face acest lucru prin setarea dinamică GOPATH pentru schimbarea spațiului de lucru și a setării GOROOT pentru schimbarea instalării Go active.

Există diverse proiecte cu sursă deschisă pentru vendorare, gestionarea pachetelor și medii virtuale. Din anumite motive, majoritatea nu acceptă Windows. Nu sunt sigur de ce astfel de instrumente trebuie să fie specifice platformei. S-ar putea să scriu eu unul dintre acești administratori de mediul înconjurător.

Concluzie

Du-te totul despre eliminarea complexității accidentale. Uneori, ea se îndepărtează ca fiind foarte strictă și prescriptivă. Dar dacă intri în modul de gândire al designerilor Go, începeți să înțelegeți că evitarea, interzicerea sau mandatul anumitor lucruri face cu adevărat totul mai simplu.

Cod