Treci la conținutul principal

Ce este

Șablonul Iterator parcurge o colecție fără a dezvălui cum este stocată. Apelantul întreabă „mai există ceva?” și „dă-mi următorul element” — dacă datele se află într-un slice, într-un arbore sau într-o bază de date rămâne o informație privată.

Pentru slice-uri și map-uri simple, range din Go este deja iteratorul tău. Șablonul contează atunci când stocarea este ascunsă sau parcurgerea este complicată.


Exemplu: parcurgerea unui playlist

Playlistul își ține melodiile private. Iteratorul oferă doar HasNext() și Next() — modul de stocare din spatele lor s-ar putea schimba complet fără să strice vreun apelant.

HasNext și Next

Bucla nu atinge niciodată slice-ul din interiorul playlistului. Înlocuiește slice-ul cu o listă înlănțuită sau cu încărcare leneșă, iar această buclă tot se compilează și rulează.

Prompt
Scrie un program Go cu șablonul Iterator: un Playlist care își ține privat slice-ul de melodii și oferă un Iterator cu metodele HasNext și Next. Parcurge playlistul cu iteratorul și afișează fiecare melodie.
Ieșire: program Go și rezultatul capturat

Când să îl folosești

Folosește-l atunci când interiorul colecției trebuie să rămână privat, când parcurgerea nu este banală (arbori, pagini dintr-un API) sau când ai nevoie de mai multe parcurgeri independente în același timp.

Renunță la el pentru slice-uri și map-uri din propriul cod — range este mai scurt, mai rapid și cunoscut de orice cititor.


Avantaje și dezavantaje

Avantaje: stocarea rămâne privată și poate fi schimbată; mai multe parcurgeri pot rula independent; parcurgerea complicată se scrie o singură dată.

Dezavantaje: mai mult cod decât range; un iterator activ peste o colecție care se schimbă este o sursă clasică de erori subtile.