Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Melaksanakan Iterators secara Idiomatik dalam Go?

Bagaimanakah Saya Boleh Melaksanakan Iterators secara Idiomatik dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-12-02 04:48:13448semak imbas

How Can I Idiomatically Implement Iterators in Go?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn