Rumah  >  Artikel  >  pembangunan bahagian belakang  >  pelbagai-over-fungsi dalam Go

pelbagai-over-fungsi dalam Go

WBOY
WBOYasal
2024-08-19 04:42:32498semak imbas

range-over-func in Go

Go1.23 telah membawa ciri julat-over-fungsi yang merupakan percubaan dalam go1.22 untuk digunakan secara nyata Jika sesiapa telah membaca kod sampel, anda mungkin perlu melakukannya bermeditasi lama-lama Jangan buat begitu. P'Yod akan menerangkan dengan cara yang sangat mudah untuk anda baca

Bermula daripada spesifikasi Untuk pernyataan dengan klausa julat, 3 jenis Ungkapan telah ditambah:

func(func() bool)
func(func(V) bool)
func(func(K, V) bool)

Saya ingin menambah satu pembolehubah untuk menerangkan seperti berikut

f func(yield func() bool)
f func(yield func(V) bool)
f func(yield func(K, V) bool)

Spesifikasi mengatakan bahawa apabila kita menggunakan fungsi f sebagai ungkapan dalam kemarahan, setiap kali kita memanggil fungsi hasil di sana sebelum menyelesaikan fungsi f, kita mendapat hasil dalam setiap gelung. Sama dengan nilai yang kami masukkan ke dalam hasil, saya masih keliru apabila saya menerangkannya. Tulis kod yang lebih baik

func main() {
    for range loop {
        fmt.Println("-")
    }
}

func loop(yield func() bool) {
    yield()
    yield()
}

output:

-
-

Jika kita menulis kod seperti ini, kita akan mendapat 2 gelung lengkap kerana kita memanggil hasil 2 kali dalam f mengikut spesifikasi, di sini kita namakannya gelung dan ia tidak akan mengembalikan apa-apa kepada kita. Kerana kami memilih untuk menggunakan corak dengan hasil yang tidak menerima sebarang hujah

Contoh lain

func main() {
    for i := range loop {
        fmt.Println(i)
    }
}

func loop(yield func(int) bool) {
    yield(3)
    yield(7)
}

output:

3
7

Seperti ini kita akan mendapat 2 pusingan juga kerana kita memanggil hasil sekali dan kini julat akan mengembalikan 2 nilai iaitu 3 dan 7 yang kita gunakan untuk memanggil hasil setiap kali

Contoh lain

func main() {
    for i := range loop {
        fmt.Println(i)
    }
}

func Loop(yield func(int, string) bool) {
    yield(3, "three")
    yield(5, "five")
    yield(7, "seven")
}

output:

3 three
5 five
7 seven

Kami akan mendapat 3 gelung dan mendapat 2 nilai setiap kali mengikut hasil yang kami masukkan setiap kali
Dan kita juga boleh memanggil hasil dengan memasukkan sebarang jenis hujah seperti

func loop(yield func(string, bool) bool) {
    yield("three", true)
    yield("five", false)
    yield("seven", false)
}

Sekarang kita faham mekanismenya. Apabila kita membaca contoh yang sukar, kita akan lebih memahami, seperti contoh dalam Go Wiki: Rangefunc Experiment

package slices

func Backward[E any](s []E) func(func(int, E) bool) {
    return func(yield func(int, E) bool) {
        for i := len(s)-1; i >= 0; i-- {
            if !yield(i, s[i]) {
                return
            }
        }
    }
}

utama

s := []string{"hello", "world"}
for i, x := range slices.Backward(s) {
    fmt.Println(i, x)
}

Lebih mudah dibaca, bukan? Pada akhirnya, bagaimana untuk menerapkannya terpulang kepada anda. Kami hanya melihat berapa kali hasil dipanggil. Anda hanya akan mendapatnya apabila anda meletakkannya dalam julat
Nilai yang akan keluar ialah nilai yang dijatuhkan ke dalam hasil

Atas ialah kandungan terperinci pelbagai-over-fungsi 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
Artikel sebelumnya:Pergi Redis Crud cepat contohArtikel seterusnya:Pergi Redis Crud cepat contoh