Struktura programu 2 roky po té - 2018-11-06 06:23:00

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.

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.

Duck typing v #GO - 2017-01-25 15:36:16

Možná už jste někdy slyšeli termín “duck typing”. Pro ty co náhodou ne, tak jen krátce uvedu, že se jedná o aplikaci známého pořekadla “kváká to jako kachna, vypadá to jako kachna, tak je to kachna”.

Představte si tyto dva typy.

type Člověk struct {
   Jméno string
}

type Mazlíček struct {
   Jméno string
}

Je jasné, že se jedné o dva typy. Člověk a Mazlíček. Oba jsou ovšem stejné - mají (sice jen jedno) pole - Jméno.

Jak na `Cannot read property 'substring' of undefined` ve VS Code - 2017-01-10 10:38:06

Pokud jako já používáte Visual Studio Code pro práci s projekty v Go tak jsme možná narazili na problém při formátování zdrojových souborů (standardně cmd + alt + L na MacOs). Místo vytouženého zformátování se zobrazí

Cannot read property 'substring' of undefined

Nuže problém je v chybějící prázdné řádce na konci souboru. Stačí tedy jen přidat na konec souboru jednu prázdnou řádku a problém je vyřešen.

Např.

package main

func main () {
....
} // následuje prázdná řádka

Více na Githubu.

Dnešní bleskovka - sady (množiny) v Golang - 2017-01-10 08:48:24

Dnes opět jen telegraficky. Go nepodporuje sady (množiny) a tak tu máme drobnou obezličku, jak si takovou sadu vytvořit. Využijeme toho, že mapy mají unikátní klíče a jsou netříděné. Že to zní povědomě? Ano! Vždyť to je přece množina.

Takže než abychom si mazali ruce nějakým bastlením kódu si uděláme např. toto:

package main

import (
	"fmt"
)

func main() {
	množinaIntů := map[int]struct{}{}
	množinaIntů[2] = struct{}{}
	množinaIntů[1] = struct{}{}
	množinaIntů[3] = struct{}{}
	množinaIntů[4] = struct{}{}
	množinaIntů[1] = struct{}{}
	// jen si mapu prosvištíme, ať víme co v ní je
        for key := range množinaIntů {
		fmt.Println("Položka množiny:", key)
	}
	// zjištění jestli množina obsahuje položku
	if _, ok := množinaIntů[1]; ok {
		fmt.Println("Množina obsahuje položku 1.")
	}
}

Padl tu dotaz, proč je použit typ map[int]struct{}. Tedy mapu s klíčem int a položkami typu prázdná struktura. Důvod je prostý, prázdná struktura zabírá (logicky) v paměti 0 bajtů.

if-else-if-else v #Go - 2016-11-02 08:37:54

Ve většině jazyků z rodiny C se větvění provádí pomocí if-else. Klasicky to funguje (např. v Go) takto.

if cosi > dalsiCosi {
   log.Println("cosi je větší než dalsiCosi.")
} else {
   log.Println("cos je menší než dalsiCosi.")
}

Takto to funguje dobře. Co když ale chceme naspat něco většího?

if cosi > dalsiCosi && time.Weekday() == time.Monday {
   log.Println("Je pondělí a cosi je větší než dalsiCosi.")
} else if cosi > dalsiCosi && time.Weekday() == time.Tuesday  {
   log.Println("Je úterý a cosi je větší než dalsiCosi.")   
} else {
   log.Println("Není pondělí a úterý, nebo cosi je menší než dalsiCosi, nebo tak něco v tom smyslu.")
}

Go ovšem nabízí tuto variantu namísto sestavy if-else-if-else.

Pracujeme s poli - 2016-10-17 11:27:00

Práce s poli patří k základům prakticky všeho. Pokud mám něčeho více jak jedna, tak se z toho stává pole. Běžně rozlišujeme tři typy polí:

  • obyčejné pole. V Go se deklaruje jako [n]T např.
   pole := [10]int

Všimněte si, že pole je typu [10]int. Tzn. velikost pole se nedá změnit. Pokud tedy předem víte, kolik prvků potřebujete a nechcete aby se to dalo změnit, pak je pole právě pro vás.

  • seznam. V Go se mu říká slice. Deklaruje se jako []T např. []int. Pokud chcete, můžete si u něj nastavit jeho počáteční kapacitu. Ovšem nikoliv při deklaraci, ale při inicializaci. Tedy např.
   seznam := make([]int, 10) // počáteční velikost pole je 10
  • množina. Mnoho jazyků přímo podporuje množiny, anlicky set. Go mezi takové jazyky nepatří, a tak musíte vzít za vděk nějakou knihovnou , která tuto funkcionalitu nabízí. Jen pro přesnost, množiny nejsou setříděné a neumožňují duplikáty.

Teď nejběžnějši operace nad poli, nebo slicy. Prvně si pole vytvoříme.

Bleskovka o ukazatelých na interface - 2016-09-30 11:00:50

Dnes si dáme první bleskovou zprávu.

### Nepoužívejte v kódu ukazatel (pointer) na interface.

Důvod.

Jakákoliv struktura, která implementuje interface, jej implementuje jak jako samotná struktura, tak jako ukazatel na strukturu.

Jen si musíte dát pozor na příjemce (receivery). Pokud příjemce předpokládá ukazatel (pointer), tak musíte volat daný příjemce na ukazateli. V následujícím příkladu je vidět, jak příjemce implementuje funkci Funkce na ukazateli a tím pádem je potřeba použít k jeho volání iface1 = &Secti{}. Tedy dereferencovat ukazatel na strukturu Secti.

#Golang a přístup k databázi - 2016-09-27 05:31:55

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í.

Konfigurace programu v #Golang - 2016-09-14 17:33:13

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.

  1. parametry příkazové řádky
  2. pomocí proměnných prostředí
  3. databáze
  4. 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.