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

pelbagai-over-fungsi dalam Go

WBOY
Lepaskan: 2024-08-19 04:42:32
asal
571 orang telah melayarinya

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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()
}
Salin selepas log masuk

output:

-
-
Salin selepas log masuk

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)
}
Salin selepas log masuk

output:

3
7
Salin selepas log masuk

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")
}
Salin selepas log masuk

output:

3 three
5 five
7 seven
Salin selepas log masuk

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)
}
Salin selepas log masuk

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
            }
        }
    }
}
Salin selepas log masuk

utama

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

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!

sumber:dev.to
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan