Programmering

Gå tutorial: Kom godt i gang med Google Go

Hvorfor vil du bruge Go-sproget? Dybest set er det et kortfattet, simpelt, sikkert og hurtigt kompileret sprog med vidunderlige samtidige funktioner, og det håndterer let store projekter. Det er også gratis open source, selvom det oprindeligt blev udviklet hos Google.

Ifølge Rob Pike, en af ​​sprogets designere, var ”målene med Go-projektet at eliminere den langsomme og klodsede softwareudvikling hos Google og derved gøre processen mere produktiv og skalerbar. Sproget blev designet af og for folk, der skriver - og læser og fejler og vedligeholder - store softwaresystemer. ”

I overensstemmelse med disse mål mangler Go mange funktioner på nogle andre fremtrædende sprog - og det er faktisk en styrke. Go er ikke objektorienteret, den har ikke headerfiler eller videresendelseserklæringer, den har ikke et typehierarki, den har ikke metode eller overbelastning af operatøren, den har ikke generiske egenskaber, den har ikke en virtuel maskine til en runtime, har den ikke undtagelser, og den har ikke påstande.

På den anden side fungerer hvad Go har ret godt. Det kan kompilere store programmer på få sekunder. Det har lavt overhead coroutines (kaldet goroutines) der kan kommunikere effektivt igennem kanaler. Det har grænseflader og grænsefladesammensætning. Derudover understøtter Go førsteklasses funktioner, højere ordensfunktioner, brugerdefinerede funktionstyper, funktionsbogstaver, lukninger og flere returværdier - med andre ord understøtter den en funktionel programmeringsstil i et stærkt skrevet sprog.

Hvis du ønsker at anmode om nogle af de manglende funktioner, jeg har nævnt ovenfor, vil du måske læse diskussionen om sprogændringer i Go-sproget FAQ: Svaret er normalt "Nej, fordi ..." Generelt er de bedste Go-programmer designet fra bunden til at bruge Go-sprogfunktioner snarere end oversat bogstaveligt fra andre sprog, der bruger forskellige abstraktioner.

Installer Go

De korte instruktioner til installation af Go vises i kildelageret. Du kan downloade binære udgivelser af Go til Windows, MacOS og Linux eller installere Go fra kilden. Du finder instruktioner til installation af Gå fra kilde på GitHub.

Hvis du allerede har Go installeret, skal du kontrollere den aktuelle buildversion nederst på //golang.org/ og derefter kontrollere din installerede version fra kommandolinjen:

$ go version

Hvis din installation er forældet, skal du downloade og installere den aktuelle version. Genstart alle åbne kommandoprompter (Windows) eller terminaler. Kør igen go version og sørg for, at versionen er, som du forventede; hvis ikke, er der muligvis en ældre version af Go installeret et andet sted, der skal fjernes.

(Nej, jeg er ikke paranoid. Det lykkedes mig at komme mig ind i den situation, jeg beskrev, ved at bruge Homebrew til at installere en version og standard MacOS-pakken til at installere den næste version en måned eller deromkring senere. De installeres forskellige steder på $ PATH. Når jeg først havde fundet ud af, hvad der var sket, kunne jeg afinstallere den gamle version med Homebrew.)

En anden installationsmulighed, hvis du vil have support og skadesløsholdelse, og du er i stand til at betale, er at bruge ActiveGo.

Når Go-kompilatoren og værktøjerne er installeret, skal du gennemgå øvelsen med at kompilere og køre et Go-program som beskrevet i afsnittet "Test din installation" på installationssiden.

Konfigurer dit Go-miljø

Go-programmører opbevarer typisk al deres kode i et arbejdsområde med beholder, pkgog src mapper. Inden for hver mappe har projekterne typisk stier, der vedrører Git-arkiver, såsom GitHub eller GitLab. For eksempel holder jeg al min Go-sprogkode under ~ / arbejde, og indstil min GOPATH miljøvariabel til $ HJEM / arbejde. Stien til min “hello.go” kildekodemappe er $ GOPATH / src / github.com / meheller / hej.

Jeg tilføjer også GOPATH / skraldespand mappe til min sti, for nemheds skyld at køre Go-programmer fra ethvert bibliotek:

eksporter GOPATH = $ HOME / arbejde

eksporter PATH = $ PATH: $ (gå env GOPATH) / bin

Go-sprogværktøjerne installeres i GOPATH som standard, så sætte GOPATH / skraldespand bibliotek på stien gør det også lettere for dig og Go-opmærksomme redaktører og IDE'er at finde dem. Du kan installere de fleste hjælpeprogrammer med $ hent når du først ved, hvilke du har brug for, og deres arkivstier. Opbevaringsstederne er normalt nemme at finde med en Google-søgning. I nogle tilfælde vil et editor-plug-in til Go installere hjælpeprogrammerne (f.eks. gocode) automatisk.

Hvis du ikke indstiller det selv, GOPATH som standard $ HJEM / gå på Unix og MacOS og % USERPROFILE% / gang på Windows.

Gå sprogværktøjer, redaktører og IDE'er

Flere Go-værktøjer er installeret som en del af pakken med compileren. Andre kan installeres med Hent kommando. De mest anvendte Go-kommandolinjefunktioner er angivet nedenfor.

 
NavnSynopsis
Manages Go-kildekoden og kører de andre kommandoer, der er anført her.
cgoAktiverer oprettelse af Go-pakker, der kalder C-kode.
dække overEt program til oprettelse og analyse af dækningsprofiler genereret af gå test -coverprofile.
rette opFinder Go-programmer, der bruger de gamle funktioner i sproget og bibliotekerne, og omskriver dem til at bruge nyere.
fmtFormater Go-pakker. Fås også som uafhængig gofmt kommando med mere generelle indstillinger.
godocUddrag og genererer dokumentation til Go-pakker.
dyrlægeUndersøger Go-kildekoden og rapporterer mistænkelige konstruktioner, såsom Printf opkald, hvis argumenter ikke stemmer overens med formatstrengen.

Den sædvanlige måde at kalde på de fleste af disse kommandoer er som underkommandoer til , for eksempel gå fmt. Andre skal kaldes via gå værktøj underkommando. På min installation, gå værktøj returnerer følgende liste over kendte værktøjer:

$ go værktøj

addr2line

asm

buildid

cgo

udarbejde

dække over

dist

dok

rette op

link

nm

objdump

pakke

pprof

test2json

tur

spor

dyrlæge

Disse værktøjer er dokumenteret som en del af den fulde liste over Go-kommandoer. Sørg forresten af ​​din GOPATH er indstillet, før du tilføjer Go-værktøjer eller Go-editor-plug-ins, der bruger Go-værktøjer.

Go-arkivet har manglet nogen editor eller IDE-understøttelse siden version 1.4, men der er masser af begge, der kender til Go, enten ud af kassen eller med tilføjelsesmoduler. Jeg diskuterede mange af disse i en artikel fra 2017; der er også en uofficiel liste vedligeholdt af Golang-samfundet.

Mine foretrukne Go-sprog-IDE'er er GoLand (vist ovenfor; omdøbt fra Gogland siden jeg skrev artiklen i 2017) og Komodo. Begge er betalte produkter med gratis prøveversioner.

Du vil gerne installere Delve for Go-fejlretning. På MacOS skal du muligvis også føje kommandolinjeværktøjerne til Xcode og muligvis tilføje et softlink til debugserver, som beskrevet i kommentaren fra 5. juni på listen Delve-spørgsmål. Løb xcode-select - installer vil også løse problemer med at finde debugserveromend på en brutal måde.

Mine foretrukne Go-klarede redaktører med GUI'er er Atom og Visual Studio Code; begge er gratis. Hvis du vælger Atom, overvej at tilføje pakkerne go-plus og go-debug; Hvis du vælger Visual Studio Code, skal du overveje at tilføje vscode-go.

Hvis du er en hardcore Vim- eller Emacs-bruger, skal du under alle omstændigheder forblive med det, du kender - ikke at jeg endda kunne lukke din redaktør fra dine kolde, døde hænder. Vim-go tilføjer Go-sprogstøtte til Vim, og go-mode tilføjer Go-sprogstøtte til Emacs.

En rundvisning

Du kan lære en hel del ved at gå igennem "A Tour of Go", enten online eller offline. Forudsat at du har afsluttet den lokale installation af Go-kompilatoren og værktøjerne, kan du installere turen til at køre lokalt ved at køre disse to kommandoer:

$ go get golang.org/x/tour/gotour

$ gotour

Den anden linje skal starte en webserver og åbne et browservindue. Dette vil se nøjagtigt ud som online-turen, men kan køre lidt hurtigere, fordi det bygger og kører kodeeksemplerne på din egen maskine. Tryk på Ctrl-C i kommandovinduet for at stoppe serveren, når du er færdig.

Turen er opdelt i tre sektioner. Jeg vil have dig til at gennemgå hele turen inklusive quizzer, men jeg opsummerer hvert afsnit nedenfor som en oversigt og stiller dig nogle spørgsmål. Jeg giver svarene på mine spørgsmål i slutningen af ​​artiklen (ikke kigger!).

Gå til grundlæggende sprog

Gå grundlæggende lektion 1

Spørgsmål 1. I dette eksempel er der tre pakker. Hvad er de, og hvordan bruges de? Hvorfor returnerer programmet altid det samme nummer, selvom der er et rand fungere?

Bemærk, at jeg ikke har kaldt lektion 2. Spring ikke over lektioner, bare fordi jeg ikke har kommenteret dem.

Gå grundlæggende lektion 3

Hvis du kører dette eksempel, får du vist fejlmeddelelser:

prog.go: 9: 14: kan ikke henvise til ikke-eksporteret navn math.pi

prog.go: 9: 14: udefineret: math.pi

Spørgsmål 2. Hvorfor fejlene? Hvordan kan du ordne programmet?

Gå grundlæggende lektion 4

Spørgsmål 3. Sammenlign denne erklæring med det tilsvarende i C. Hvad er forskelligt?

Gå grundlæggende lektion 8

Spørgsmål 4. Hvorfor kaster dette program ingen fejl?

Gå grundlæggende lektion 10

Spørgsmål 5. Hvad er typen af k? Hvorfor? Hvis typen ikke er åbenbar, skal du se på lektion 11 for at finde ud af, hvordan du viser den.

Gå grundlæggende lektion 12

Denne lektion svarer på det spørgsmål, jeg stillede i lektion 8.

Gå Flow Control Lektion 1

Spørgsmål 6. Hvordan er dette forskelligt fra til loop på dit yndlingssprog? Tror du, at de andre looping-konstruktioner på dit yndlingssprog er nødvendige? Skifter de yderligere oplysninger i de næste tre lektioner dig?

Gå Flow Control Lektion 7

Inden du kører dette program, skal du kontrollere det og skrive ned, hvad du tror, ​​det vil udskrive. Kør programmet. Var du korrekt? Hvis ikke, hvad forstod du ikke?

Gå Flow Control Lektion 8

Dette er den slags øvelse, du kan få i begyndelsen af ​​et whiteboard-interview. Time dig selv, mens du træner det. Sig hvad du tænker, mens du arbejder igennem problemet.

Spørgsmål 7. Resten af ​​flowkontrolafsnittet er vigtigt at forstå. Efter at have gennemgået lektion 9 til 13, forklar Go kontakt og udsætte udsagn på en måde, som en C-, Java- eller JavaScript-programmør kunne grok.

Gå flere typer Lektion 1

Inden du kører dette program, skal du kontrollere det og skrive ned, hvad du tror, ​​det vil udskrive. Kør programmet. Var du korrekt? Hvis ikke, hvad forstod du ikke?

Hvad synes du om at gå med pegepinde, men ikke pege-aritmetik?

Arbejd gennem sektionen Flere typer, indtil du kommer til øvelsen i lektion 18. Spørgsmål 8. Hvad lærte du om Go-arrays og skiver? Gennemfør nu øvelsen.

Fortsæt gennem øvelsen i lektion 23.

Spørgsmål 9. Forklar en Go kort. Hvorfor vil du bruge en?

Afslut afsnittet Flere typer.

Spørgsmål 10. Kan Go bruges som et funktionelt programmeringssprog, selvom det er kompileret? Hvornår og hvorfor bruger du lukninger?

Gå metoder og grænseflader

Gå gennem alle 25 lektioner i dette afsnit begyndende med //tour.golang.org/methods/1.

Spørgsmål 11. Når du er færdig, skal du forklare, hvordan Go's brug af metoder og grænseflader adskiller sig fra C ++ -klasser. Hvilket kan du lide bedre? Hvorfor?

Gå samtidig

Goroutinen er et af de definerende træk ved Go for concurrency. I den første lektion i samtidighedssektionen skal du prøve at skrive et bord på programmet (nedenfor) og skrive ned, hvad du tror, ​​det vil udskrive.

Kør programmet. Var du korrekt? Forklar hvad der faktisk sker, og hvorfor.

Kanaler er vejen til implicit at synkronisere goroutines. I den næste lektion (nedenfor) skal du prøve at skrivebordet igen, før du kører det.

Spørgsmål 12. Hvorfor er der kun en kanal i dette eksempel, selvom der er to goroutine-opkald?

Select-sætningen lader en goroutine vente på flere kommunikationsoperationer. Hvad er rækkefølgen, som udsagn kører i programmet nedenfor?

Øvelsen på tilsvarende binære træer er en anden, du kan støde på i et tavleinterview. Time dig selv og forklar din tænkning, når du implementerer en løsning. Tilsvarende gør øvelsen med at implementere en webcrawler, som om du var i et interview.

Svar på Go-spørgsmål

Svar 1. Pakker er udpeget af pakke erklæring for det aktuelle program og af importere erklæring for eksterne pakker, der bruges. I dette enkle program vigtigste er programmets egen pakke, og det importeres fmt så den kan udskrives, og matematik/rand så det kan generere et tilfældigt tal.

De forskellige metoder i rand stole på klokkeslæt for at generere tilfældige tal, men tiden er fast i gotour miljø. Som en opfølgningsøvelse skal du finde pakken og metoden, der rapporterer klokkeslættet (tip: se her, hvis du sidder fast), og brug den til at udskrive det aktuelle tidspunkt. Kør dette flere gange i gotour miljø, og bygg også programmet lokalt og kør det flere gange på din egen maskine.

Svar 2. Eksport i Go skal altid være stort, og sproget er store og små bogstaver. matematik.Pi er den korrekte metode.

Svar 3. I C / C ++ variabel erklæringer følger formularen (f.eks. int i, j, k;), hvorimod i Go går typen efter variabelnavnet og kan udelades, så længe typen kan udledes. I C / C ++ går returtypen forud for et funktionsnavn, mens det i Go kommer efter funktionsparameterlisten og før funktionselementet. I C / C ++ er efterfølgende semikolon obligatorisk.

Svar 4. Det kaster ikke fejl, fordi Go-variabler, der ikke ellers er indstillet, initialiseres til typens nulværdi, f.eks. 0 eller falsk. I C / C ++ markerer kompilatoren ikke-initialiserede variabler.

Svar 5.k er et heltal, fordi det blev initialiseret til 3.