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ă.
Ieșire: program Go și rezultatul capturat
package main
import "fmt"
type Playlist struct {
songs []string
}
// Iteratorul parcurge colecția fără a expune slice-ul.
type Iterator struct {
playlist *Playlist
position int
}
func (p *Playlist) Iterator() *Iterator {
return &Iterator{playlist: p}
}
func (it *Iterator) HasNext() bool {
return it.position < len(it.playlist.songs)
}
func (it *Iterator) Next() string {
song := it.playlist.songs[it.position]
it.position++
return song
}
func main() {
p := &Playlist{songs: []string{"intro", "strofă", "refren"}}
for it := p.Iterator(); it.HasNext(); {
fmt.Println("se redă:", it.Next())
}
}
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.