Programování

Go tutorial: Začínáme s Google Go

Proč byste chtěli používat jazyk Go? V zásadě jde o výstižný, jednoduchý, bezpečný a rychlý kompilovaný jazyk s úžasnými funkcemi souběžnosti a snadno zvládne velké projekty. Je to také bezplatný otevřený zdroj, i když byl původně vyvinut ve společnosti Google.

Podle Roba Pikea, jednoho z návrhářů jazyka, „cílem projektu Go bylo eliminovat pomalost a neobratnost vývoje softwaru ve společnosti Google, a tím zvýšit produktivitu a škálovatelnost procesu. Jazyk byl navržen a pro lidi, kteří píší - a čtou, ladí a udržují - velké softwarové systémy. “

V souladu s těmito cíli postrádá Go mnoho funkcí některých dalších významných jazyků - a to je vlastně síla. Go není objektově orientovaný, nemá záhlaví ani dopředná deklarace, nemá hierarchii typů, nemá přetížení metody ani operátora, nemá generika, nemá a virtuální stroj za běhu, nemá výjimky a nemá tvrzení.

Na druhou stranu to, co má Go, funguje docela dobře. Dokáže sestavit velké programy za pár sekund. Má coroutiny s nízkou režií (tzv goroutiny), které mohou efektivně komunikovat prostřednictvím kanály. Má rozhraní a složení rozhraní. Go navíc podporuje funkce první třídy, funkce vyššího řádu, uživatelem definované typy funkcí, funkční literály, uzávěry a více návratových hodnot - jinými slovy podporuje styl funkčního programování v silně psaném jazyce.

Pokud chcete požádat o některou z chybějících funkcí, které jsem zmínil výše, možná si budete chtít přečíst diskuzi o jazykových změnách v Go language FAQ: Odpověď je obvykle „Ne, protože ...“ navrženy od nuly k používání funkcí jazyka Go, nikoli překládány doslovně z jiných jazyků, které používají různé abstrakce

Nainstalujte Go

Krátké pokyny pro instalaci Go se objeví ve zdrojovém úložišti. Můžete si stáhnout binární vydání Go pro Windows, MacOS a Linux nebo nainstalovat Go ze zdroje. Pokyny k instalaci Go ze zdroje najdete na GitHubu.

Pokud již máte Go nainstalovaný, měli byste zkontrolovat aktuální verzi buildu v dolní části //golang.org/ a poté zkontrolovat nainstalovanou verzi z příkazového řádku:

$ go verze

Pokud je vaše instalace zastaralá, stáhněte a nainstalujte aktuální verzi. Restartujte všechny otevřené příkazové příkazy (Windows) nebo terminály. Opakovat go verze a ujistěte se, že verze odpovídá očekávané verzi; pokud ne, může být někde nainstalována starší verze Go, kterou je třeba odstranit.

(Ne, nejsem paranoidní. Podařilo se mi dostat se do situace, kterou jsem popsal, pomocí Homebrew k instalaci jedné verze a standardního balíčku MacOS k instalaci další verze asi o měsíc později. Instalují se do různých umístění na $ CESTA. Jakmile jsem zjistil, co se stalo, mohl jsem odinstalovat starou verzi pomocí Homebrew.)

Další možností instalace, pokud chcete podporu a odškodnění a jste schopni platit, je použití ActiveGo.

Jakmile máte nainstalovaný překladač a nástroje Go, měli byste projít cvičením kompilace a spuštění programu Go, jak je popsáno v části „Otestujte instalaci“ na stránce instalace.

Nastavte prostředí Go

Programátoři Go obvykle uchovávají veškerý svůj kód v jednom pracovním prostoru s zásobník, bal, a src složky. V rámci každé složky mají projekty obvykle cesty, které se vztahují k úložištím Git, jako je GitHub nebo GitLab. Například nechávám celý svůj jazykový kód Go pod ~ / práce, a nastavit můj GOPATH proměnná prostředí do $ DOMŮ / práce. Cesta k mé složce zdrojového kódu „hello.go“ je $ GOPATH / src / github.com / meheller / ahoj.

Také přidám GOPATH / koš adresář na mou cestu, pro pohodlí při spouštění programů Go z libovolného adresáře:

export GOPATH = $ HOME / práce

export PATH = $ PATH: $ (go env GOPATH) / bin

Jazykové nástroje Go se nainstalují v GOPATH ve výchozím nastavení, takže uvedení GOPATH / koš adresář na cestě také usnadňuje jejich vyhledání editorům a IDE podporujícím Go. Většinu nástrojů můžete nainstalovat pomocí $ jdi dostat jakmile víte, které z nich potřebujete a jejich cesty úložiště. Úložiště lze obvykle snadno vyhledat pomocí vyhledávání Google. V některých případech nainstaluje pomocný program editor pro Go (např. gocode) automaticky.

Pokud to nenastavíte sami, GOPATH výchozí nastavení $ HOME / jít na Unixu a MacOS a % USERPROFILE% / go ve Windows.

Přejít na jazykové nástroje, editory a IDE

Několik nástrojů Go je nainstalováno jako součást balíčku s kompilátorem. Ostatní lze nainstalovat pomocí jdi si příkaz. Níže jsou uvedeny nejpoužívanější nástroje příkazového řádku Go.

 
názevSynopse
jítSpravuje zdrojový kód Go a spouští další zde uvedené příkazy.
cgoUmožňuje vytváření balíčků Go, které volají kód C.
PokrýtProgram pro vytváření a analýzu profilů pokrytí generovaných jít otestovat -profil.
opravitVyhledá programy Go, které používají staré funkce jazyka a knihoven, a přepíše je tak, aby používaly novější.
fmtBalíčky formátů Go. K dispozici také jako nezávislý gofmt příkaz s obecnějšími možnostmi.
božeExtrahuje a generuje dokumentaci pro balíčky Go.
veterinářProzkoumává zdrojový kód Go a hlásí podezřelé konstrukce, například Printf volání, jejichž argumenty se neshodují s formátovacím řetězcem.

Obvyklý způsob volání většiny těchto příkazů je jako dílčí příkazy jít, například jdi fmt. Ostatní je třeba volat prostřednictvím jít nástroj dílčí příkaz. Na mé instalaci, jít nástroj vrací následující seznam známých nástrojů:

$ go nástroj

addr2line

asm

buildid

cgo

kompilovat

Pokrýt

dist

doc

opravit

odkaz

nm

objdump

balíček

pprof

test2json

prohlídka

stopa

veterinář

Tyto nástroje jsou dokumentovány jako součást úplného seznamu příkazů Go. Mimochodem, ujistěte se, že GOPATH je nastavena před přidáním jakýchkoli nástrojů Go nebo jakýchkoli doplňků editoru Go, které používají nástroje Go.

Repozitář Go postrádal od verze 1.4 podporu jakéhokoli editoru nebo IDE, ale o Go je spousta z nich, ať už z krabice nebo s doplňkovými moduly. O mnoha z nich jsem hovořil v článku z roku 2017; existuje také neoficiální seznam udržovaný komunitou Golang.

Moje oblíbené IDE v jazyce Go jsou GoLand (zobrazeno výše; přejmenováno z Goglandu, protože jsem článek napsal v roce 2017) a Komodo. Oba jsou placené produkty s bezplatnými zkušebními verzemi.

Budete si chtít nainstalovat ladění Delve for Go. V systému MacOS budete možná muset přidat nástroje příkazového řádku do Xcode a případně přidat měkký odkaz debugserver, jak je popsáno v komentáři z 5. června v seznamu problémů s Delve. Běh xcode-select - install také opraví problémy s hledáním debugserver, i když hrubou silou.

Moje oblíbené Go-aware editory s GUI jsou Atom a Visual Studio Code; oba jsou zdarma. Pokud zvolíte Atom, zvažte přidání balíčků go-plus a go-debug; pokud zvolíte Visual Studio Code, zvažte přidání vscode-go.

Pokud jste tvrdým uživatelem Vim nebo Emacs, pak v každém případě zůstaňte na tom, co víte - ne že bych mohl dokonce vytrhnout vašeho editora z vašich chladných, mrtvých rukou. Vim-go přidává podporu jazyka Go pro Vim a go-mode přidává podporu jazyka Go pro Emacs.

Prohlídka cesty

Můžete se toho trochu naučit tím, že projdete „Prohlídku cesty“, ať už online nebo offline. Za předpokladu, že jste dokončili místní instalaci kompilátoru a nástrojů Go, můžete prohlídku nainstalovat a spustit lokálně spuštěním těchto dvou příkazů:

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

$ mám

Druhý řádek by měl spustit webový server a otevřít okno prohlížeče. To bude vypadat přesně jako online prohlídka, ale může běžet trochu rychleji, protože vytváří a spouští ukázky kódu na vašem vlastním počítači. Po dokončení stiskněte Ctrl-C v příkazovém okně a zastavte server.

Prohlídka je rozdělena do tří částí. Chci, abyste prošli celou prohlídkou, včetně kvízů, ale každou část shrnu níže jako přehled a položím vám několik otázek. Odpovědi na své otázky uvádím na konci článku (žádné pokukování!).

Přejít na základy jazyka

Přejít na základní lekci 1

Otázka 1. V tomto příkladu existují tři balíčky. Co to je a jak se používají? Proč program vždy vrátí stejné číslo, i když existuje rand funkce?

Všimněte si, že jsem nezavolal Lekce 2. Nevynechávejte lekce jen proto, že jsem je nekomentoval.

Jděte na základní lekci 3

Pokud spustíte tento příklad, zobrazí se chybové zprávy:

prog.go: 9: 14: nemůže odkazovat na nevyvezené jméno math.pi

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

Otázka 2. Proč chyby? Jak můžete program opravit?

Jděte na základní lekci 4

Otázka 3. Porovnejte toto prohlášení s ekvivalentem v C. Co se liší?

Jděte na základní lekci 8

Otázka 4. Proč tento program nevyvolává žádné chyby?

Jděte na základní lekci 10

Otázka 5. Jaký je typ k? Proč? Pokud typ není zřejmý, podívejte se na lekci 11 a zjistěte, jak jej zobrazit.

Jděte na základní lekci 12

Tato lekce odpovídá na otázku, kterou jsem položil v lekci 8.

Jděte na lekci Řízení toku 1

Otázka 6. Jak se to liší od pro smyčka ve vašem oblíbeném jazyce? Myslíte si, že další smyčkové konstrukce ve vašem oblíbeném jazyce jsou nezbytné? Změní váš názor další informace v následujících třech lekcích?

Jděte na lekci Flow Control 7

Před spuštěním tohoto programu jej zkontrolujte a napište, co si myslíte, že vytiskne. Spusťte program. Měl jsi pravdu? Pokud ne, čemu jste nerozuměli?

Jděte na lekci Řízení toku 8

Toto je druh cvičení, které byste mohli dostat na začátku pohovoru na tabuli. Načasujte si to, jak to budete řešit. Při řešení problému řekněte, na co myslíte.

Otázka 7. Zbytek části řízení toku je důležité pochopit. Po absolvování lekcí 9 až 13 vysvětlete Go přepínač a odložit příkazy takovým způsobem, aby se programátor C, Java nebo JavaScript mohl chytit.

Jdi na více typů lekce 1

Před spuštěním tohoto programu jej zkontrolujte a napište, co si myslíte, že vytiskne. Spusťte program. Měl jsi pravdu? Pokud ne, čemu jste nerozuměli?

Jak se cítíte, že máte ukazatele, ale ne aritmetiku ukazatele?

Projděte si sekci Více typů, dokud se nedostanete na cvičení v Lekce 18. Otázka 8. Co jste se dozvěděli o polích a řezech Go? Nyní dokončete cvičení.

Pokračujte v cvičení v lekci 23.

Otázka 9. Vysvětlete Go mapa. Proč byste ho chtěli použít?

Dokončete sekci Další typy.

Otázka 10. Může být Go použit jako funkční programovací jazyk, přestože je kompilován? Kdy a proč byste používali uzávěry?

Go metody a rozhraní

Projděte si všech 25 lekcí v této části počínaje //tour.golang.org/methods/1.

Otázka 11. Až budete hotovi, vysvětlete, jak se metody a rozhraní Go liší od tříd C ++. Který se vám líbí lépe? Proč?

Jděte souběžně

Goroutine je jednou z definujících funkcí Go pro souběžnost. V první lekci v sekci souběžnosti zkuste zkontrolovat program (níže) a zapište si, co si myslíte, že se vytiskne.

Spusťte program. Měl jsi pravdu? Vysvětlete, co se vlastně děje a proč.

Kanály jsou způsob, jak implicitně synchronizovat goroutiny. V další lekci (níže) se znovu pokuste zkontrolovat program před spuštěním.

Otázka 12. Proč je v tomto příkladu pouze jeden kanál, přestože existují dvě hovory goroutine?

Příkaz select umožňuje goroutine čekat na více komunikačních operací. Jaké je pořadí spouštění příkazů v níže uvedeném programu?

Cvičení na ekvivalentních binárních stromech je dalším, na které se můžete setkat v rozhovoru na tabuli. Při implementaci řešení si udělejte čas a vysvětlete své myšlení. Podobně proveďte cvičení implementace webového prohledávače, jako byste byli v rozhovoru.

Odpovědi na otázky Go

Odpověď 1. Balíčky jsou označeny balík prohlášení pro aktuální program a import prohlášení pro používané externí balíčky. V tomto jednoduchém programu hlavní je vlastní balíček programu a importuje se fmt aby mohl tisknout, a matematika/rand aby mohl vygenerovat náhodné číslo.

Různé metody v rand při generování náhodných čísel se spoléhají na čas hodin, ale čas je pevně nastaven na mám životní prostředí. V rámci následného cvičení najděte balíček a metodu, která hlásí čas (nápověda: pokud se zaseknete, podívejte se sem) a použijte jej k tisku aktuálního času. Spusťte to několikrát v mám prostředí, a také lokálně vytvořit program a spustit ho několikrát na svém vlastním počítači.

Odpověď 2. Export v Go musí být vždy velkými písmeny a jazyk rozlišuje velká a malá písmena. matematika. Pi je správná metoda.

Odpověď 3. V deklaracích proměnných C / C ++ postupujte podle formuláře (např. int i, j, k;), zatímco v Go přejde typ za názvem proměnné a lze jej vynechat, pokud lze odvodit typ. V C / C ++ návratový typ předchází názvu funkce, zatímco v Go jde za seznam parametrů funkce a před tělo funkce. V C / C ++ jsou koncové středníky povinné.

Odpověď 4. Nevyvolává chyby, protože proměnné Go, které nejsou jinak nastaveny, jsou inicializovány na nulovou hodnotu typu, např. 0 nebo Nepravdivé. V C / C ++ kompilátor označí neinicializované proměnné.

Odpověď 5.k je celé číslo, protože bylo inicializováno na 3.