V dnešní době nad neexistuje aplikace, která by nepřistupovala do databáze. Samozřejmě si můžeme ukládat data do souboru a mnohdy je to i efektivnější řešení, ale databáze nám luxusně umožní data ukládat a načítat a nestarat se přitom o detaily. V dnešní době rozdělujeme databáze do 2 proudů.
- SQL databáze (nebo také relační databáze) - tedy databáze, kde jsou data ukládána jako relace mezi entitami. Většina z nich také garantuje ACID (atomičnost operací, konzistenci stav, integritu dat a durabilitu uložení). Mezi nejznámější patři MySql, PostgreSQL, Oracle, MS SQL Server atd.
- NoSQL databáze - tedy databáze, které nevyžadují striktní schéma (ad hoc ukládání dat) místo ACID používají BASE (pouze základní dostupnost, měnící se (měkký) stav a eventuální konzistenci) - což samo osobě je slovní hříčka - prostě kyselost a zásaditost :-). Představily jsou MongoDB, Redis, Apache Cassandra, ElesticSearch apod.
Dnes si povíme, jak přistupovat k SQL databázím. Už proto, že Go tyto databáze standardizuje, na rozdíl od NoSQL, kde standard není.
V první části povídání o testování jsme si ukázali vcelku jednoduchý test a spustili jsme si jej.
Jedním z požadavků na testování je, aby testy doběhly co nejdříve. Je to proto, že chceme mít smyčku zpětné vazby co nejkratší. Nikdo nestojí o to, aby čekal více jak minutu na informaci, že je všechno v pořádku. Ale pak se naskytuje otázka - co v případě, že test závisí na něčem pomalém. Třeba databázi. Nebo volání externí služby přes HTTP. V tom případě tu máme celou plejádu možností a podíváme se na ně.
Testování pro mnoho lidí (včetně mě) není nic zábavného, ale po letech programování připouštím, že je lehčí mít pořádné testy, než neustále kompilovat a spouštět aplikaci a pomocí debuggeru se snažit pochopit, co je špatně. Už ta ztráta času. I když je Go hodně rychlé, kompilace pořád představuje pár vteřin, následně spustit aplikaci, dostat na místo, kde si chcete něco ověřit a následně konečně to ověřit. Mnohdy to vyžaduje např. zásahy do databáze, otevírání browseru a navigace na stránky apod. Prostě a jednoduše, je to neefektivní. A hlavně, jsme programátoři, automatizujeme co se dá!
Tentokrát kratší vsuvka.
Potřeboval jsem na svém Macovi zkompilovat program pro 🐧 Linux. Samozřejmě mě jako první napadl cross compiler, ale to není ono. Nehledě na to, že bych pak stejně nemohl program vyzkoušet. Samozřejmě by s trochou cviku šlo zkusit nějaký VirtualBox apod., ale mě napadlo elegantnější řešení - Docker!
Nejdřív si nainstalujete na počítač docker - podívejte se na instalační stránky a vyberte si instalaci podle svého systému. V ideálním případě by toto mělo fungovat:
Dnes si povíme něco o tom, jak si nakonfigurovat takový program v Go.
Konfigurací zde myslím způsob, jak předat programu parametry, aby mohl běžet nezávisle. V zásadě máte několik možností a pojďme si o nich povědět detailněji.
- parametry příkazové řádky
- pomocí proměnných prostředí
- databáze
- specializované programy
Tento výčet není konečný, ale prozatím si s ním vystačíme.
Příkazová řádka
Podívejme se na první možnost, parametry na příkazové řádce.
Pro tento případ má Go package flags
. Možná už jste si sami všimli, že na rozdíl od jazyků odvozených od C (C, C++, Java apod.) tu funkce main
nepřijímá pole parametrů. Pro připomenutí, takto vypadá main
v Go.
Čas od času budete potřebovat svoje dílo uložit někam jinam, než na svůj počítač. Mnozí budou dokonce pomýšlet na sdílení svého kódu s ostatními např. na githubu. K tomu je samozřejmě nejpříhodnější použít git
. A jak nejlépe na to?
V první řadě je potřeba mít nainstalovaný git. Majitelé maců to mají jednoduché, tam je většinou git hned v základu. Ostatní si nainstalují git buď pomocí apt-get
, nebo yum
.
Nyní máte dvě možnosti. Už jste si napsali nějaký kód a chcete ho dát např. na github, nebo jste ještě nic nenapsali, ale chcete kód (který teprve napíšete) např. na github.
Jak se říká, žádný člověk není ostrov, tak ani žádný program není ostrov. Programy závisí na knihovnách jazyka a na dalších knihovnách. Go řeší tedy dva problémy. Jak závislost získat a jak závislost použít.
Aby mohlo Go závislost získat, musí vědět, kde se závislost nachází. A k tomu slouží právě posledně zmiňované jméno package. Pokud máme např. package github.com/stretchr/testify
, tak je naprosto zřejmé, že ji můžeme stáhnout z githubu. Go nám v tom ale rádo pomůže. Stačí jen říct go get github.com/stretchr/testify
a závislost je v našem GOPATH
.
Jelikož už známe syntaxi jazyka a umíme napsat např. Hello world
, tak nastává čas si říct něco o tom, jak si nakonfigurovat prostředí, abychom mohli pracovat s Go.
Instalace je jednoduchá. Pokud jste na Macovi, pak doporučuji použít homebrew
, i když si můžete stáhnout instalačky. Linux je podobný, yum
nebo apt
vám zajisté pomohou. Co se Windows týče, tam bohužel sloužit nemohu, ale na vlastní oči jsem viděl Go běžet na Windows, tak to určitě půjde.
Jazyk Go byl vytvořen, jelikož bylo potřeba dokončit práci. Není to poslední
trend ve světě počítačové vědy, ale je to nejrychlejší a nejnovější způsob,
jak řešit realné problémy.
Go používá známé koncepty imperativních jazyků se statickým typováním.
Rychle se kompiluje a také rychle běží. Přidává snadno pochopitelnou
podporu konkurenčnosti, což umožňuje využít výhody multi-core procesorů a
jazyk také obsahuje utility, které pomáhají se škálovatelným programováním.
Go má již v základu vynikající knihovnu a je s ním spojená nadšená komunita.
Než si povíme, proč programovat v Go a ne třeba v Java, tak odkaz na informace o jazyku Go na wikipedia.
Po této trošce suché teorie něco praxe. Programovací jazyky se dělí do několika skupin. V rámci nich Go zapadá do těchto:
- kompilovaný - programy v Go se musí před během kompilovat, na rozdíl od jazyků typu JavaScript, nebo Python
- nativní - programy v Go se kompilují do nativního kódu. Programy tedy nepotřebují běhové prostředí, jako např. Java (ta má JVM), nebo .net (ten má .net framework)
- silně typovaný - program psaný v Go může použít pouze typy známé v době kompilace. To je rozdíl proti např. JavaScript, kde jsou typy známi až v době spuštění.
- strukturální - typy nemusí uvádět, s jakým typem jsou kompatibilní. Třeba Java jakožto nominální jazyk toto musí uvádět (
class b extends a
)
- funkcionální - v Go jsou funkce občany první kategorie. Funkce mohou přijímat funkce jako parametr a také je vracet. Toto např. Java do verze 8 neuměla.
Když tedy víme, co je Go zač, tak důvody proč si zvolit Go: