Jít | ||
Datum první verze | 10. listopadu 2009 | |
---|---|---|
Paradigma | Zkompilovaný jazyk , souběžné , imperativní a strukturované programování | |
Autor |
Robert Griesemer (ne) Rob Pike Ken Thompson |
|
Poslední verze | 1.16.5 (3. června 2021) | |
Vývojová verze | 1.16beta1 (17. prosince 2020) | |
Psaní na stroji | Silný , statický , strukturální | |
Ovlivněno |
C Python Oberon-2 ( en ) Limbo Active Oberon ( en ) Komunikace sekvenčních procesů Pascal Oberon Smalltalk Newsqueak ( en ) Modula-2 Alef APL BCPL Modula ( en ) Occam |
|
Operační systém | Windows , GNU / Linux , Mac OS X , FreeBSD , OpenBSD , DragonflyBSD , Solaris , plán 9 | |
Licence | Licence BSD , patentovaná | |
webová stránka | golang.org | |
Přípona souboru | jít | |
Go je kompilovaný a souběžný programovací jazyk inspirovaný C a Pascalem . Tento jazyk vyvinul Google z počátečního konceptu Roberta Griesemera , Roba Pikka a Kena Thompsona . Go má dvě implementace: první používá gc , překladač Go; druhá používá gccgo , „ frontend “ GCC napsaný v C ++ . Go je napsán v jazyce C pomocí yacc a GNU Bison pro analýzu až do verze 1.4 a v samotném Go pro další verze (1.5).
Cíl Go dává Rob Pike, jeden z jeho tří tvůrců, který o nezkušených vývojářích říká:
"Nemohou rozumět skvělému jazyku, ale chceme je přimět, aby vytvářeli dobré programy." Jazyk, který jim dáváme, tedy musí být snadno srozumitelný a snadno osvojitelný “
Go chce usnadnit a zrychlit programování ve velkém měřítku: vzhledem k jeho jednoduchosti je proto myslitelné použít jej také pro psaní aplikací, skriptů nebo velkých systémů. Tato jednoduchost je také nezbytná k zajištění údržby a vývoje programů v průběhu několika generací vývojářů.
I když se také zaměřuje na rychlost provádění, nezbytnou pro programování systému, považuje multithreading za nejsilnější prostředek k zajištění této rychlosti na současných procesorech a zároveň usnadňuje údržbu oddělením jednoduchých úkolů prováděných nezávisle, aby se zabránilo vytváření „plynových továren“. Tento design také umožňuje provoz bez zápisu na vícejádrových architekturách okamžitým využitím odpovídajícího zvýšení výkonu.
Zde je příklad typického programu Hello world napsaného v Go:
package main import "fmt" func main() { fmt.Printf("Hello, world\n") }Jazyk Go byl vytvořen pro programování systému a od té doby byl rozšířen o aplikace, což je stejný cíl jako C a zejména C ++. Je to imperativní a konkurenční jazyk . Jeho rychlost kompilace (kvůli jednoduchosti jeho syntaxe) jej někdy dělá použitým jako skriptovací jazyk.
Go přímo integruje, jako je Java , souběžné zpracování kódu. Klíčové slovo goumožňuje spuštění volání funkce v soutěži s aktuálním goroutinem . Goroutine , tak pojmenovaný na dálku obdobně jako koprogram , je podproces provádění dohlíží plánovači zahrnuty do běhu. Program poté využije topologii počítače k nejlepšímu provedení goroutinů, ne nutně v novém vlákně, ale je také možné, že skupina goroutinů je multiplexována do skupiny vláken.
Pro volání funkce f napíšeme f () . To nazvat jako goroutine, my prostě napsat go f () , který je velmi podobný volání f úkolu; z PL / I , jazyk, který také zvládá multitasking od roku 1970.
Goroutiny spolu komunikují předáváním zpráv , odesíláním nebo přijímáním zpráv přes kanály.
Tyto zprávy vzájemně synchronizují goroutiny v souladu s modelem CSP , který autoři považují za intuitivnější než model s více vlákny (se synchronizací semafory obsahujícími zámky, což je představa, kterou zavedl také Dijkstra ).
V současném stavu jazyka (2018)
Jazyk obsahuje aspekty Pascalu a C, ale vystavíme se mnoha chybám, pokud na okamžik zapomeneme, že nejsme ani v Pascalu, ani v C. Takže a:=bpřidělíme proměnnou a tak, že jí přiřadíme hodnotu a typ b, ale pokud proměnná již byla přidělena, stačí napsat a=b. Nesmí být zaměňována s a==b(rovnost hodnot). Výraz za a ifnevyžaduje závorky, ale výraz, který se má provést, pokud test projde, musí být uzavřen do složených závorek. Ve svém současném stavu kompilátor netoleruje, že deklarovaná proměnná není použita, což rozhodně podporuje dobré postupy, ale způsobí, že ladění programů bude velmi bolestivé pomocí pokusů a omylů.
Go zná skalární typy (celá čísla intnebo int64, plováky float, řetězce string), pole indexovaná celými čísly začínajícími na 0, mapy, které jsou kolekcemi objektů indexovaných pomocí klíčů ( v jiných jazycích nazývané slovníky , hashe nebo asociativní pole ) a řezy, které jsou dynamickým zobecněním pole.
Snadno přistupuje ke souborům pro čtení a zápis, ať už v řádkovém nebo znakovém režimu, nebo absorbováním celého souboru prostřednictvím balíků os a io .
Go má systém statického typu , silně typizovaný , strukturální a bezpečný , založený na odvození typu s možností použití explicitního psaní.
Uvedeme příklad, zápis s := "Camélia", který deklaruje, přiděluje a inicializuje s, je možný a nevynucuje zápis var s string = "Camélia", který však zůstává akceptován.
Kompatibilita typu sloučeniny je založena spíše na vlastnostech než na názvu. To znamená, že dva složené typy budou ekvivalentní, pokud jsou jejich vlastnosti ekvivalentní: stejný název vlastnosti a ekvivalence typů. Toto je strukturální psaní .
To má za následek, že jazyk není předmětem v klasickém smyslu (ať už s třídami nebo s prototypem ), avšak návrháři jazyka se rozhodli pro statičtější jazyk originálněji. Je možné definovat metody přenášení rozhraní popisující chování objektu (je také snadno možné kombinovat několik rozhraní do jednoho). Funkce Go mohou deklarovat přijetí argumentu z tohoto rozhraní. Jako argument této metody lze předat objekt deklarující všechny metody tohoto rozhraní se stejným podpisem. Kontrola typu se provádí staticky kompilátorem.
Skutečnost, že Go není objektem v klasickém smyslu, znamená, že Go nemá žádnou dědičnost typu a žádnou podtřídu. To umožňuje obejít problémy, které tyto systémy představují, jako je vícenásobná dědičnost v jazycích, které to umožňují (například v C ++ ), nebo jednoduchá dědičnost ( například v Javě ). S ekvivalencí typu založenou na vlastnostech Go nepotřebuje dědičnost typu. Podtřída je emulována pomocí „typu stravování“. To usnadňuje mixování dvou nezávisle navržených kódových bází, aniž byste museli sdílet běžné typy.
Viditelnost struktur, atributů, proměnných, konstant, metod, typů nejvyšší úrovně a funkcí mimo jejich balíček deklarací je definována v případě prvního znaku jejich identifikátorů .
Go pracuje v Unicode jak pro jeho zdrojový kód, tak pro zpracování řetězců. Jeho literatura však upouští od výrazových kódových bodů pro zkratky run . Postupy umožňují transformovat reprezentace znaků na runy (libovolná runa zabírající pevnou velikost) a transformovat pomocí standardních postupů řadu znaků Unicode na runy pole (jedna runa na prvek), stejně jako naopak, aniž by bylo nutné žonglovat reprezentace proměnné délky nebo starosti s tím, zda je stroj malý-endian nebo big-endian . Přenositelnost je proto zajištěna.
Hovoříme-li o runách, vyhýbáme se nejasnostem, které by se vyskytovaly u znaků nebo bajtů . Abychom prozkoumali řetězec, buď použijeme funkce řetězce přímo, nebo jej procházíme od runy k runě.
Velká písmena národních znaků (například „è“ ⇒ „È“) se dělají jednoduše pomocí unicode.ToUpper(r rune) rune. Runy vám umožňují zadat libovolný znak Unicode, thajský, čínský, řecký znak, včetně jazyka APL - a také jakýkoli emotikon, který se tam nachází.
V Go je správa paměti zpracována garbage collector .
Obecný program zatím neexistuje, i když o tom návrháři jazyka uvažují. Neexistuje žádné přetížení metody ani aritmetika ukazatele . Konečně neexistují žádná tvrzení ani výjimky . Nahradit tyto dva, GB poskytuje klíčová slova defer, panica recoverkteré poskytují mechanismy podobné jazyka výjimkou manipulační systémy, jako je C ++ a Java (klíčová slova try, catch, finallya throw).
Go může komunikovat s knihovnami C / C ++, vývojáři třetích stran, kteří již vyvinuli vazby pro SDL a MySQL .
Go definuje standardní formát kódu (z hlediska odsazení a prezentace řídicích struktur) a poskytuje nástroj pro jeho použití (go fmt).
Go také nabízí systém dokumentace a testovací rámec založený na kódu.
Kompilační jednotka go je balíček, který je ve standardní implementaci reprezentován adresářem a soubory přímo obsaženými v tomto adresáři.
Import balíčku se provádí pomocí jeho cesty importu a lze zadat buď standardní knihovnu, nebo také balíčky třetích stran nainstalované ve vzdálených zdrojových úložištích (aktuálně podporováno: úložiště pod svn , git , mercurial a bazaar ).
Ačkoli je Go původně určen k produkci robustních systémových aplikací a nikoli uživatelských programů, odkazy na OpenGL se vyvíjejí experimentálně.
Stejně jako C i Go vyžaduje, abyste uvedli, které knihovny budete používat. Na rozdíl od C, které považuje za kompilace chybně, pokud je tato knihovna není použita. Kompilátor Go ve skutečnosti neobsahuje žádné varovné zprávy podle výběru návrhářů: „Není nutné označovat, co by nebylo nutné opravit“.
Hlavní knihovny:
Knihovny jsou někdy nezávislé, někdy závislé. Existuje také několik způsobů, jak dělat podobné věci. Například ke čtení souboru můžete použít ioutil.ReadAll , file.Read () nebo bufio.NewScanner () .
Seznam knihoven získáme z příkazového řádku podle go list all.
Go umožňuje rekurzivní volání programů, díky nimž jsou někdy čitelnější, bez nadměrné ztráty rychlosti:
package main import "fmt" import "time" var s [61]int func fib(n int) int { if n < 3 { return 1 } if s[n] != 0 { return s[n] } s[n] = fib(n-1) + fib(n-2) return s[n] } func main() { var i int t0 := time.Now() for i = 1; i <= 60; i++ { fmt.Printf("fib(%d) = %-15d\t", i, fib(i)) } println() println("Durée :", time.Since(t0).Seconds()) }Tento program je formátován standardním způsobem go pomocí nástroje gofmt s možnostmi -s (pokud je to možné, zjednodušte kód) a -w (napište upravený kód na místo ). Tento nástroj zarovnává úrovně hloubky programu, což usnadňuje údržbu, zejména pokud více vývojářů potřebuje udržovat stejný kód. Všimněte si, že svisle nevyrovná otevírací a zavírací závorky, přičemž většina současných editorů (2018) je zodpovědná za vizuální signalizaci shod v režimu úprav.
Go syntaktické volby nejsou jednomyslné. Pokud tento jazyk tvrdí, že je ve svém psaní zjednodušující, někteří jej kritizují za příliš působivé a dogmatické předsudky, protože jeho syntaxi kvalifikoval jako matoucí a kompilátor s pochybnou rigiditou, přičemž mimo jiné citoval:
Jazyk byl kritizován za to, že má „motor Ferrari v karoserii Ford T“.
Na druhou stranu Go navrhuje zjednodušit syntaxi C, záměrně uchovávanou v C ++, aby byla zajištěna zpětná kompatibilita, například odstraněním syntakticky zbytečných závorek za ifa for, navržením výchozího propadu v a switchatd. Tyto změny mohou poskytnout čitelnější programy.
Seznam významných bezplatných aplikací napsaných v Go: