Rumah > Artikel > pembangunan bahagian belakang > pelbagai-over-fungsi dalam 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!