V minulém díle jsme se podívali na nástroj mage a jeho použití pro sestavování #Go programů. Tentokrát se podíváme na jednu specialitku, která asi nebyla předem zřejmá, ale rozhodně stojí za prozkoumání.
Jak z minula víte, mage
potřebuje tzv. magefile
. Magefile je vlastně go-skript na stereoidech. Pokud tedy chceme sestavit projekt, který používá magefile
, tak zadáme na příkazovou řádku něco jako mage
a máme hotovo (když je tedy definovaný defaultní cíl). Pokud bychom ovšem chtěli, aby se náš projekt takto pěkně spustil na našem CD/CI serveru, tak budeme muset přidat ještě něco - instalaci samotného mage
. Takže náš skript by vypadal jako
Sastavování (kompilace + linkování) v Go je jedna z věcí, kde vládne organizovaný chaos. Samozřejmě go build
prostě funguje. Ale v dnešní době je potřeba dělat mnohem víc věcí, než prosté go build
. Bohužel nějaký standardní způsob neexistuje. Jelikož jsem odkojený Un*xem, tak preferuji nástroje, které se samy nabízejí - make
. Člověk si udělá makefile
a je spokojený - jako například tento. Nevýhodou makefilů je, že ne všichni jim rozumí, a i ti, kdo jim rozumí, obecně neznají všechny finty. Ruku na srdce, kdo ví, co dělá na příklad toto go fmt $$(go list ./... | grep -v /vendor/)
.
Včera začal vycházet velmi slibný seriál o #Go na root.cz od Pavla Tišnovského.
Vřele doporučuji!
Jsou to již více než dva roky, co jsem se v tomto článku rozepsal nad strukturou programu v #Go. A jelikož s časem rostou zkušenosti myslím, že je čas popsat, co se od té doby změnilo a jak strukturuju programy teď.
V první řadě nám #Go podporuje moduly, tedy od verze 1.11. Takže když začnu nový projekt, okamžitě dělám go mod init
. Moduly ovšem nelze použít na $GOPATH
, takže je potřeba se jí vyhnout. Ovšem nic vám nebrání pracovat jako dříve, být na $GOPATH
a používat na správu závislostí něco jiného - třeba dep
.
Píšety monolity? Pak možná máte jeden problém, ale za to velký.
Píšete micro-servicy? Pak možná máte mnoho problémů, ale menších.
Co takhle psát miniservicy? To byste měli trochu běžných problémů. Prostě zlatá střední cesta.
Co je to miniservice. Je to něco většího než mikroservice, má řekněme 10-20 endpointů, popř. stejný počet gRPC, či jiných endpointů. Zachovává si tedy určité rysy microservice, ale přitom se z ní nestává monolit. Správa farmy miniservice je tedy přeci jen jednodušší, přitom když jedna spadne, je možné ji rychle nahodit a nespadne kvůli tomu zbytek služeb.
Nebojte, #Go nekončí, ba naopak, bohužel už je tak velké, že se objevují vykukové, co svojí “chytrostí” odrovnají kdejaký jazyk, nebo technologii.
O čem mluvím. Tento článek na blogu #Go https://blog.golang.com/wire propaguje výhody DI (dependency injection). Ano, 20 let stará technologie, která spolehlivě odbourala Javu, a teď přichází ke #Go.
Rozhodně se nejedná o první pokus, nebo nápad tohoto typu. Řekl bych, že snad každý člověk přicházející ke #Go z Javy dostane tento nápad, ale tentokrát je to poprvé, co se to dostalo na tak prominentní místo.
V tomto příspěvku se podíváme na to, co to je reflexe, na co se používá a hlavně jak se používá. Hned z kraje jedna moudrá hláška
Zřejmé je vždy lepší než chytré … a reflexe není nikdy zřejmá.
Takže varování hned na úvod - reflexe ano, ale musíte k tomu mít dobrý důvod.
O co se tedy jedná. Reflexe je schopnost zjišťovat si informace a typech a hodnotách dat za běhu programu. Ti kdo se s reflexí ještě nesetkali se možná ptají proč. Vždyť přeci kompilátor ví, jakého typu hodnoty jsou a za běhu není problém se k nim dostat. To je sice pravda, ale v okamžiku, kdy do svého kódu přidáte abstrakci, tedy interfacy, a nedej bože prázdné interfacy, už ani vy, ani kompilátor neví, jakého typu je proměnná a tím pádem nemáte možnost se ani zeptat na její hodnotu.
1.9.3 - 2018-01-23 13:06:03
Dnes byly vydána nová verze Go 1.9.3. Jedná se pouze o opravy celkem nepodstatných chyb, ale nikdy není na škodu upgradovat.
Jako vždy stačí stáhnout z https://golang.org/dl/, nebo počkat, až se Go objeví v repu vaší oblíbené distribuce.
Go vercajk - 2017-11-11 06:52:47
Jelikož stále nejsem schopný dát dohromady návod na šifrování v Go (skončil jsem u nástřelu, ale nedaří se mi ho dokončit), tak se posunu na další kapitolu a tou je váš/náš vercajk při práci s Go.
Každý jazyk má svoji sadu nářadí (tooling) se kterou se pracuje. Například Java. Pokud chci pracovat v Javě, tak je skoro jisté, že jako IDE použiji Ideu, nebo Eclipse, programy budu sestavovat pomocí mavenu, nebo gradlu, testovat budu např. JUnit, nejspíš se vykašlu na všechny možný experimenty a použiji Spring na všechno. Co je ale hlavní, máte relativně velký výběr a nic vás nebrání zkoušet jiné nástroje a postupy.
Throttling je způsob, jak omezit počet běžících vláken. Pokud chceme, abychom nezahltili druhý systém (subsystém) nekontrolovaným množství paralelních volání, potřebujeme způsob, jak omezit počet běžících go rutin.
Určitě je mnoho způsobů, jak toho docílit, nabízím zde jeden, který se mi osvědčil.
V zásadě vycházím z toho, že zápis do kanálu blokuje, pokud je překrečena kapacita bufferu kanálu.
Tedy
ch := make(chan int, 1)
ch <- 1 // OK
ch <- 2 // blokuje, dokuď někdo kanál nepřečte
Tento konkrétní příklad vám neprojde, samotné Go detekuje deadlock (zápis bez čtení v jediné go rutině) a radši program zabije.