Treci la conținutul principal

Map-uri în Go

Un map stochează date asociind chei cu valori, iar fiecare element este o pereche cheie:valoare.

Elementele nu au o ordine fixă, le poți modifica liber, iar aceeași cheie nu poate apărea de două ori.

Pentru a afla câte elemente are un map, adică lungimea lui, apelează len().

Un map care nu a fost inițializat are valoarea nil.

În spate, un map păstrează referințe către un tabel hash.

Go îți oferă mai multe moduri de a crea un map, iar secțiunile următoare le parcurg.


Crearea map-urilor folosind var și :=

Atât cuvântul cheie var, cât și operatorul de declarare scurtă := pot fi folosite pentru a crea un map cu valori inițiale.

Notă: Nu te aștepta ca un map să păstreze ordinea pe care ai scris-o în cod. Go aranjează datele stocate în felul său, astfel încât căutarea valorilor să rămână rapidă.

Exemplu

Prompt
Creează două map-uri folosind sintaxa literală: un map string-la-string pentru o mașină și un map string-la-int pentru orașe. Afișează ambele map-uri.
Ieșire: Program Go și ieșirea capturată

Sintaxa map cu var și :=

main.go
var a = map[KeyType]ValueType{key1:value1, key2:value2,...}
b := map[KeyType]ValueType{key1:value1, key2:value2,...}

Crearea map-urilor folosind funcția make()

Funcția make() este o altă opțiune. Îți dă un map pe care îl poți completa apoi câte o cheie pe rând.

Exemplu

Prompt
Creează două map-uri folosind funcția make(). Adaugă perechile cheie-valoare una câte una pentru o mașină și pentru orașe. Afișează ambele map-uri.
Ieșire: Program Go și ieșirea capturată

Sintaxa map cu make

main.go
var a = make(map[KeyType]ValueType)
b := make(map[KeyType]ValueType)

Crearea unui map gol

Un map gol poate fi obținut cu funcția make() sau cu o declarație var fără valoare inițială.

Notă: Doar prima variantă este gata de folosit, așa că make() este cea pe care trebuie să o alegi. Varianta cu var este nil, așa cum arată ieșirea, iar scrierea în ea provoacă un panic la rulare.

Exemplu

Prompt
Arată diferența dintre crearea unui map gol cu make() și fără. Afișează dacă fiecare este nil.
Ieșire: Program Go și ieșirea capturată

Tipuri de chei permise

O cheie poate folosi orice tip care suportă operatorul de egalitate (==), deoarece Go trebuie să poată compara cheile. Asta include:

  • Booleeni
  • Numere
  • String-uri
  • Array-uri
  • Pointeri
  • Struct-uri
  • Interfețe (cu condiția ca tipul dinamic să poată fi comparat pentru egalitate)

Trei tipuri nu pot fi chei:

  • Slice-uri
  • Map-uri
  • Funcții

Motivul este că == nu este definit pentru niciunul dintre ele.


Tipuri de valori permise

Valorile nu au o astfel de limită: un map poate stoca valori de orice tip.


Accesarea elementelor unui map

Pentru a citi un element, pune cheia lui între paranteze pătrate după numele map-ului.

Exemplu

Prompt
Creează un map cu make(), adaugă cheile brand, model și year, apoi accesează și afișează valoarea pentru "brand".
Ieșire: Program Go și ieșirea capturată

Sintaxa de accesare a map-ului

main.go
value = map_name[key]

Actualizarea și adăugarea elementelor unui map

Atribuirea unei valori unei chei face două lucruri. Dacă cheia există deja, valoarea ei este actualizată; dacă nu, se adaugă un element nou.

Exemplu

Prompt
Creează un map, afișează-l, apoi actualizează un element și adaugă unul nou. Afișează map-ul din nou.
Ieșire: Program Go și ieșirea capturată

Sintaxa de actualizare a map-ului

main.go
map_name[key] = value

Eliminarea unui element din map

Apelează funcția delete() cu map-ul și o cheie pentru a elimina acel element.

Exemplu

Prompt
Creează un map, afișează-l, șterge cheia "year" folosind delete() și afișează map-ul din nou.
Ieșire: Program Go și ieșirea capturată

Sintaxa de ștergere din map

main.go
delete(map_name, key)

Verificarea existenței unor elemente într-un map

Căutarea unei chei poate returna două valori, de unde vine modelul val, ok. ok îți spune dacă cheia există, chiar și atunci când valoarea ei este goală, cum se întâmplă cu day în exemplu.

Când te interesează doar dacă există cheia, pune identificatorul gol (_) în locul lui val.

Exemplu

Prompt
Verifică chei existente și inexistente într-un map folosind modelul val, ok. Folosește și identificatorul gol pentru a verifica doar existența cheii.
Ieșire: Program Go și ieșirea capturată

Sintaxa de verificare a map-ului

main.go
val, ok := map_name[key]

Map-urile sunt referințe

O variabilă de tip map se referă la un tabel hash, nu conține datele în sine.

Așadar, când două variabile indică același tabel hash, o modificare făcută prin oricare dintre ele este vizibilă și prin cealaltă.

Exemplu

Prompt
Arată că map-urile sunt referințe. Atribuie map-ul a lui b, modifică o valoare în b și arată că și a s-a modificat.
Ieșire: Program Go și ieșirea capturată

Iterarea peste map-uri

O buclă range parcurge fiecare cheie și valoare dintr-un map. Nu te baza pe ordine, deoarece aceasta se poate schimba de la o rulare la alta.

Exemplu

Prompt
Iterează peste un map folosind range și afișează fiecare pereche cheie-valoare.
Ieșire: Program Go și ieșirea capturată

Iterarea peste map-uri într-o ordine specifică

Un map nu are o ordine proprie. Pentru a-i parcurge elementele într-o anumită succesiune, păstrează acea succesiune într-o altă structură de date, cum ar fi un slice de chei, și parcurge-o pe aceea.

Exemplu

Prompt
Arată cum se iterează un map într-o ordine specifică folosind un slice separat care definește ordinea.
Ieșire: Program Go și ieșirea capturată