Abych trochu přispěl do diskuze.
Go používáme na produkci. Ve sledovanitv.cz s ním např. streamujeme desítky 10Gb/s. Používáme ho řadu let. Začali jsme s ním tedy dříve, než vznikl zmiňovaný hype.
Za jeho hlavní výhody považuji:
- Pragmatický přístup vývojářů. Má to právě ty věci, které jsou potřeba na praktický vývoj, ale nic navíc.
- Konzervativní přístup ke změnám a promyšlenost návrhu směrem do budoucna. Pokud člověk napsal program v souladu se specifikací 1.0, tak i v nejnovější verzi kompilátoru a základní knihovny program bude fungovat beze změn.
- Snaží se tlačit jeden styl. Dá se potom dobře číst a přidávat kód jiných lidí.
- Jednoduchost a snaha zredukovat magic a překvapivé chování. Žádné přetěžování operátorů, žádné settery/gettery, automatické konverzy typů, overloaded funkce. Je pak snadné vyčíst, co kód dělá.
- Snadná paralelizace, na kterou je připraven celý jazyk a základní knihovna.
- Výkon programů, ačkoliv se jedná o paměťově bezpečný jazyk ve smyslu žádné buffer overflow a neplatné pointery.
- Jednoduchost nástrojů.
- Základní knihovna, která je velmi konzistentní a umožňuje logické propojení funkcionalit z různých jejích částí. Jednoduché věci lze udělat jednoduše, ale nebrání mi si do něčeho sáhnout po svém.
Nemohu souhlasit s některými tvrzeními. Zejména, že se jedná o jazyk pro lepiče jako PHP. Přístup vývojářů PHP je v mnoha ohledech přesně opačný. Do PHP se pořád přidávají nové konstrukce a funkcionality, aby to umělo všechno možné. Některé funkce pak vrací chybové výsledky, jiné hází výjimky.
Taky rozhodně nelze tvrdit, že to není OOP jazyk, tudíž se v něm programuje procedurálně. Mohli bychom se přít, co znamená OOP. Liší se hodně od Javy (nemá třídy, hierarchii typů). Ale rozhodně umí polymorfismus a zapouzdření, což jsou podle mě ty nejdůležitější vlastnosti z OOP. Programuje se hodně objektovým stylem a základní knihovna je tak postavená. Koncept interfaců v Go je velmi šikovný a je hodně blízký abstraktním datovým typům. Důsledkem je existence velmi malých interfaců, které splňuje kdeco. Tudíž to lze jednoduše propojovat.
Některé věci mě také zarazily, ale posléze mi došlo, že autoři Go to měli promyšlené. Např. jazyk nepodporuje výjimky, chyby jsou návratové hodnoty. Říkal jsem si, teď musím všude testovat návratovou hodnotu, což je nepohodlné. Ale pak jsem si všiml několika věcí:
- Nelibost vůči chybovým návratovým hodnotám byla částečně způsobena tím, že zejména v C mají funkce jen jednu návratovou hodnotu. A pro signalizaci chyby se často používají speciální hodnoty (např. -1). To je zmatečné a navíc o chybě nemám žádné podrobnosti. V Go se to řeší vracením více hodnot a jedna z nich je chyba.
- V Javě hází výjimku případy, které vlastně nejsou výjimečné (např. parsování řetězce poslaného uživatelem na číslo, otevření souboru, který nemusí existovat). Tyto chyby často chci ošetřit v normální toku programu a místo toho musím blbnout s catch bloky.
- Zvláště u serverových aplikací je potřeba na chyby patřičně reagovat (zkusit něco znovu, stornovat co nejmenší práci), spíše než je jen detekovat. Výjimky vedou k tomu, že programátoři nechají výjimku propadnout na místo, kde už nelze dobře řešit.
- Chyba jako extra návratová hodnota člověka donutí se fakt zamyslet nad tím, co s tou chybu bude dělat.
Další sporný příklad je, že standardní nástroje pro instalací balíků třetích stran neřeší jejich verze. (Mimochodem v aktuální verzi 1.11 to už je a i předtím existovaly "neoficiální" nástroje). Což mělo jeden velmi pozitivní výsledek. Všichni napsali balíky tak, že jsou zpětně kompatibilní. Prostě je zvykem dělat úpravy tak, aby se kompatibilita nerozbíjela. Za mě jednoznačné plus. Například takové javascriptové npm umožňuje balíkům záviset na různých verzích jiného balíku, což vyřeší veškeré zpětné i dopředné nekompatibility. Ale je z toho naprosté peklo pro údržbu, balast ve výsledných souborech a práce při přechodu na novější verzi, protože vývojáři rozbíjí kompatibilitu jako šílenci.
Co týče výkonu, tak si nemohu stěžovat. Jasně, že to v čistém algoritmu nemá na C. Ale reálně se to používá na věci, kde se provádí věci paralelně a dělá se rozličné I/O. A tam si vede velmi dobře a poráží Javu.
V jazyce mi chybí snad generika, která by se hodila do přísně typovaného jazyka. O tomto nedostatku autoři vědí, ale řekli, že aktuálně neznají dobrou implementaci, která by nenarušovala jiné zásady. Tak je tam nedali, protože by je tam pak museli tak nechat.