Adakah Terdapat Pelaksanaan Iterator Idiomatik dalam Go?
Saluran, mengingatkan iterator, menawarkan lelaran melalui kata kunci julat. Walau bagaimanapun, ketidakupayaan untuk keluar dari gelung tersebut tanpa mencipta kebocoran goroutine mengehadkan kegunaannya. Mencari corak lelaran yang lebih idiomatik, pembangun telah mengemukakan soalan tentang cara mengulang secara ekspresif dan menggabungkan iterator menggunakan operator seperti peta, penapis dan pengurangan.
Pendekatan Berasaskan Penutupan
Walaupun kemudahan saluran, penutupan selalunya terbukti lebih sesuai. Penutupan membenarkan penciptaan iterator yang menjana nilai secara berurutan. Berikut ialah contoh mencipta lelaran untuk nombor genap menggunakan penutupan:
func newEven() func() int { n := 0 return func() int { n += 2 return n } }
Pendekatan Berasaskan Kaedah
Jika penutupan tidak sesuai dengan keinginan anda, anda boleh menggunakan jenis bernama dengan kaedah:
type even int func (e *even) next() int { *e += 2 return int(*e) }
Perdagangan dan Rantaian
Pilihan antara penutupan dan kaedah melibatkan pertukaran. Penutupan lebih fleksibel, manakala kaedah menyediakan struktur yang lebih jelas.
Perangkaian adalah mudah dalam Go berkat sifat fungsi kelas pertama. Contoh berikut menunjukkan cara merantai penjana nombor genap dengan fungsi kuasa dua:
func mapInt(g intGen, f func(int) int) intGen { return func() int { return f(g()) } } func square(i int) int { return i * i }
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Iterators secara Idiomatik dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!