Pracujeme s poli

Publikováno 10-17-2016 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.

   pole := [10]int // prázdné pole
   pole2 := [2]int{1, 2} // pole vyplněné prvky 1 a 2
   proměnná := pole2[0] // proměnná má hodnotu 1, indexujeme od 0
   for index, číslo := range pole2 { // vypíšeme obsah pole
      fmt.Printf("%d:%d", index, číslo)
   }
   

Pokud začneme používat slicy, tak si užijeme mnohem více legrace. Popravdě, na pole v Go moc nenarazíte. Můžeme samozřejmě polemizovat, co je šetrnější k paměti a co se rychlosti přístupu k prvkům týče, ale mikrooptimalizace tohoto typu už jsou přeci jen v dnešní době přežité.

	slice := []int{} // prázdný slice, musí se inicializovat
	fmt.Printf("slice: %#v\n", slice)
	slice2 := []int{1, 2}              // slice inicializovaný na hodnoty 1 a 2
	proměnná := slice2[0]              // proměnná má hodnotu 1, indexuje se od 0
	for index, číslo := range slice2 { // vypíšeme obsah pole
		fmt.Printf("%d:%d\n", index, číslo)
	}

Do teď to bylo copy-paste, teď ale postupujeme na další level.

Přidání položky do slicu

	slice3 := append(slice2, 3) // přidáme prvek ke slicu, původní slice2 zůstal jaký byl!
	fmt.Printf("slice3: %#v\n", slice3)
	proměnná = slice3[2] // proměnná má hodnotu 3
	fmt.Printf("proměnná: %#v\n", proměnná)

Vytvoření sub-slicu, tedy části původního slicu od začátku do indexu.

	slice4 := slice3[:2] // slice4 obsahuje 1, 2 (od začátku slice3, do indexu 2 včetně).
	fmt.Printf("slice4: %#v\n", slice4)

Vytvoření dalšího sub-slicu od indexu do konce.

	slice5 := slice3[1:] // slice 5 obsahuje 2, 3 (od indexu 1 do konce)
	fmt.Printf("slice5: %#v\n", slice5)

Pokud chceme odstranit element ze slicu, tak na to máme tuto fintu

	slice6 := append(slice3[:1], slice3[2:]...) // slice6 obsahuje 1 a 3 (2 jsme vymazali, pokud se to tak dá říct)
	fmt.Printf("slice6: %#v\n", slice6)

Pokud chceme naopak chceme to slicu přidat, tak se to dělá následovně.

	slice7 := append(slice6[:1], append([]int{2}, slice6[1:]...)...)
	fmt.Printf("slice7: %#v\n", slice7)   

Možná se mýlím, ale řekl, bych že více se toho s poli asi dělat nedá. Nebo snad ano? Pokud od něčem víte, dejte mi vědět!

comments powered by Disqus