Dátové kolekcie patria medzi základné typy v každom modernom jazyku. Umožňujú ukladať prvky rovnakého typu a následne k nim pristupovať pomocou indexu alebo kľúča.
Go pozná tri základné typy dátových kolekcií:
- Pole:
array[N]T
, - Výrez:
slice[]T
, - Mapa:
map[K]T
.
Kde T
je akýkoľvek typ, K
je typ, ktorý implementuje rovnosť (napríklad string
) a N
je kladné celé číslo.
Pole - Array
Pole, rovnako ako v iných programovacích jazykoch je súbor rovnakých dátových typov s fixnou veľkosťou. Deklarácia je veľmi jednoduchá, hoci iná ako vo väčšine ostatných jazykoch, podobná Slovenskému pravidlu “píš ako počuješ” a môže byť rovnako ako premenné inicializované niekoľkými spôsobmi:
[N]T
[N]T{v1,v2,...,vN}
[...]T{v1,v2,...,vN}
|
|
Pole má fixnú veľkosť v pamäti alokovanú pri inicializácii, čo zlepšuje rýchlosť oproti dynamicky alokovaným dátovým štruktúram, ale veľkosť nie je možné zmeniť. Taktiež v Go je pole samostatný typ ([2]int je iný typ ako [3]int). Pole je hodnotový typ, odovzdáva sa medzi funkciami hodnotou a nie ako adresa objektu. To znamená že v parametri pri volaní funkcie sa celé kopíruje čo znižuje výkon. Kvôli týmto obmedzeniam sa v Go používa sa veľmi zriedka.
Výrez - Slice
Výrez je najdôležitejší kompozitný generický typ a je rozšírená verzia poľa:
- deklaruje sa ako pole ale bez veľkosti, alebo
make([]Type, length, capacity)
- môže dynamicky rásť a zmenšovať sa
- má veľkosť, kapacitu a ukazovateľ na element v pamäti
Základné operácie:
- pridanie prvkov:
append(slice,v1,v2,...,vN)
- odkrojenie, pričom pôvodný a nový slice zdieľa prvky:
[begin:end]
- kopírovanie prvkov:
copy(dest, src)
Kde begin
je index od začiatku a end
je počet preskočených prvkov od konca.
|
|
Na pochopenie ako fungujú
slice
pomôže rozumieť ako sú implementované - ako nadstavbová štruktúra nad <code>array</code> ktorá obsahuje pointer na prvý element, veľkosť a kapacitu, je kopírovaná pri odovzdávaní ako parameter do fukncií a poskytuje užitočné funkciecopy
aappend
. Preto ak nemeníme veľkosť výrezu, iba hodnotu prvkov, nemusíme odovzdávať funkcii ukazovateľom.
Mapa - Map
Asociačná mapa je nezoradný súbor dát uložených ako pár kľúč-hodnota, podobná “dictionary” alebo “hashmap” z iných programovacích jazykov. Používa sa na rýchle vytiahnutie hodnoty podľa kľúča.
Interne je mapa implementovaná ako ukazovateľ na <code>runtime.hmap</code> štruktúru, ktorá obsahuje veľkosť, funkciu equal(), funkciu hash(), pointer na pole bucketov (bucket je pole K/V hodnôt) a ďalšie atribúty. Kľúče aj hodnoty môžu mať hodnotu
nil
. Mapu teda v parametri funkcie nemusíme odovzdávať ukazovateľom, ak chceme obsah meniť.
Základné operácie:
- vytvorenie:
make(M, n)
, pričom M je typ mapy a n kladné celé číslo úvodná kapacita - iná forma vytvorenia:
*new(map[K]N)
- zmazanie prvku
delete(map, key)
|
|
Mapy, rovnako ako výrezy nie sú bezpečné pre konkurentné použitie - simultánny zápis a čítanie prvkov je nedefinovaná operácia. Konkurentný prístup musí byť koordinovaný cez nejaký synchronizačný mechanizmus (
sync.Mutex
). Pri iterovaní prvkami mapy poradie nie je špecifikované ani garantované, že bude rovnaké medzi dvomi iteráciami. Pre garantované poradie musí byť udržiavaná osobitná štruktúra kľúčov v požadovanom poradí.
Referencie
- Go Data Structures
- Go Slices: usage and internals
- Arrays, slices (and strings): The mechanics of 'append'
- Package list - linked list - obojstranne linkovaný zoznam, PushBack, Front, Remove
- Go maps in action
- Dave Cheney - Practical Go
Vaše otázky, návrhy a komentáre
Verím, že vás tento návod inšpiroval a budem vďačný ak dáte spätnú väzbu a pomôže mi zamerať sa na to čo by vás zaujímalo.