Go (programovací jazyk)

Go
Go
Go
Paradigma imperativní, strukturovaný, objektově orientovaný
Vznik 10. listopadu 2009
Autor Robert Griesemer
Rob Pike
Ken Thompson
Vývojář Google Inc.
Poslední verze 1.16.5[1] (3. červen 2021)
Hlavní implementace gc, gccgo
Ovlivněn jazyky C, occam, Modula, Newsqueak, Oberon, Pascal, Python, Limbo[2]
OS Linux, macOS, Microsoft Windows, FreeBSD, Plan 9 from Bell Labs[3]
Licence BSD
Web golang.org

Go je kompilovaný multiparadigmatický programovací jazyk vytvořený v Google Inc.[4] v roce 2007. Jeho původní autoři jsou Robert Griesemer, Rob Pike a Ken Thompson. Jedná se o staticky typovaný jazyk se syntaxí odvozenou z jazyka C. Jazyk zaručuje typovou bezpečnost, ale obsahuje určité vlastnosti typické pro dynamicky typované jazyky. Jazyk byl představen v listopadu roku 2009.

Design jazyka

Go nepochybně patří do rodiny jazyků odvozených od C, ale přináší mnoho změn za účelem konzistence, jednoduchosti a bezpečnosti.

  • Vlastnosti typické spíše pro dynamicky typované jazyky:
    • Stručná deklarace a inicializace proměnných pomocí odvození typu (x := 0 místo int x = 0;).
    • Rychlá kompilace.
    • Balíčkovací manažer a online dokumentace.
  • Odlišné přístupy k různým problémům:
    • Souběžnost procesů přímo na úrovni jazyka.
    • Rozhraní jsou implementována implicitně.
    • Použití tzv. embedding místo dědičnosti.
    • Produkce staticky linkovaných programů bez dalších závislostí.
  • Snaha udržet specifikaci jazyka jednoduchou i za cenu vynechání vlastností běžných u jiných jazyků:[5]

Syntaxe

Syntaxe jazyka obsahuje změny oproti C pro zajištění čitelnosti kódu. Programátor nemusí specifikovat typ výrazu, což umožňuje nahradit int i = 3; respektive char* s = "řetězec"; konstrukcemi i := 3 respektive s := "řetězec". Nejsou vyžadovány středníky na konci řádků. Funkce mohou vracet libovolný počet hodnot. Návratový pár result, err je typický způsob předávání chyb volajícímu.

Datové typy

Kvůli bezpečnosti jsou oproti C přidány následující typy:

  • Slice (např. []byte) je ukazatel na pole. Uchovává ukazatel na začátek pole, velikost a kapacitu, která určuje, kdy musí být alokována nová paměť při zvětšování velikosti pole. Pro rozšiřování pole slouží zabudovaná funkce append.
  • Pro zápis řetězců slouží typ string, který je reprezentován jako []byte, ale jeho obsah je neměnný.
  • Existuje také vestavěná hashovací tabulka (např. map[string]int).
  • Kvůli podpoře souběžnosti na úrovni jazyka existuje typ channel (např. chan int).

Konvence a code style

Autoři i komunita kladou velký důraz na sjednocení stylu a designu Go programů:

  • Odsazování, zarovnávání a jiné konvence pro styl kódu jsou automaticky standardizovány pomocí nástroje go fmt, golint slouží pro dodatečné kontroly stylu.
  • Nástroje a knihovny distribuované spolu s Go pobízejí k využívání standardizovaných nástrojů pro API dokumentaci (godoc), testování (go test), kompilaci (go build), balíčkovací systém (go get), aj.
  • Syntaktická pravidla vyžadují věci, které jsou v jiných jazycích volitelné (např. absence kruhových závislostí, zákaz nevyužitých proměnných nebo importovaných knihoven nebo žádné implicitní přetypování).
  • Vynechání některých vlastností (zkratky známé z funkcionálního programování jako map funkce nebo výjimky (try/catch) nabádá k využití explicitního imperativního programovacího stylu.
  • Hlavní autoři často píší a přednáší o stylu, správném návrhu a filozofii Go.

Přidružené nástroje

Distribuce Go obsahuje např.:

  • go build – kompilace a vytváření binárních souborů, pro kompilace stačí pouze informace ve zdrojových souborech (žádný Makefile),
  • go test – unit testování a benchmark,
  • go fmt – formátování kódu,
  • go vet – statická analýza, hledání potenciálních chyb v kódu,
  • go run – zkratka pro kompilaci a spuštění,
  • godoc – dokumentace,
  • go generate – generování kódu.

Mimo tyto nástroje existují ještě další, které sice nejsou součástí oficiální distribuce, ale jsou také hojně využívány:

  • gorename – bezpečné přejmenování identifikátorů,
  • gocodenašeptávání, které lze napojit do různých textových editorů,
  • goimports – automatické přidávání/odebírání importovaných knihoven podle potřeby.

Typový systém

Go implementuje polymorfismus pomocí rozhraní. Proměnné typu rozhraní obsahují ukazatel na instanci na haldě a druhý na informaci o typu instance. Nejobecnější rozhraní interface{} neobsahuje žádné metody.

Go 2 obsahuje generické typy. Generické mohou být struktury i rozhraní, například:

type I[T any] interface {
  type *T
}

type S[T any, PT I[T]] struct {}

Typový systém Go 2 je podobný typovému systému Rustu, zejména traitům.

Hello World

Oficiální Hello World, který demonstruje, že jazyk používá pro práci s textovými řetězci kódování UTF-8.

package main

import "fmt"

func main() {
	fmt.Println("Hello, 世界")
}

Reference

  1. Release History [online]. [cit. 2021-06-03]. Dostupné online. (anglicky) 
  2. Language Design FAQ [online]. 2010-01-16 [cit. 2010-01-18]. (Golang.org). Dostupné v archivu pořízeném dne 2010-08-18. 
  3. Go Porting Efforts [online]. cat-v, 2010-01-12 [cit. 2010-01-18]. (Go Language Resources). Dostupné online. 
  4. KINCAID, Jason. Google’s Go: A New Programming Language That’s Python Meets C++ [online]. TechCrunch, 2009-11-10 [cit. 2010-01-18]. Dostupné online. 
  5. Rob Pike, The Changelog Archivováno 20. 10. 2013 na Wayback Machine. podcast (anglicky)

Externí odkazy

Zdroj