Dalam bahasa Go, fungsi adalah warga kelas pertama dan merupakan asas untuk menulis kod berkualiti tinggi. Penutupan ialah fungsi khas yang boleh mengekalkan keadaan dalaman fungsi dengan merujuk pembolehubah luaran. Dalam artikel ini, kita akan membincangkan senario penggunaan penutupan dan fungsi dalam bahasa Go.
1.
Penutupan ialah sejenis fungsi istimewa. Ringkasnya, penutupan ialah fungsi yang mempunyai akses kepada pembolehubah yang ditakrifkan dalam persekitaran leksikalnya. Dalam bahasa Go, penutupan boleh dilaksanakan melalui sarang fungsi dan rujukan pembolehubah. Contohnya:
func outer() func() { count := 0 return func() { count++ fmt.Println(count) } } func main() { counter := outer() counter() // 1 counter() // 2 counter() // 3 }
Dalam kod di atas, fungsi outer
mengembalikan fungsi yang berkongsi pembolehubah outer
yang ditakrifkan dalam skop fungsi count
. Dengan cara ini, kita boleh mencapai tujuan menyimpan keadaan antara panggilan fungsi.
2. Senario penggunaan penutupan
Pengaturcaraan fungsional ialah pengaturcaraan yang menekankan pengendalian fungsi dan gabungan paradigma fungsi. Penutupan memainkan peranan penting dalam pengaturcaraan berfungsi. Dengan menggunakan penutupan, kita boleh melaksanakan teknik seperti kari dan gubahan fungsi untuk menjadikan kod lebih ringkas dan boleh dibaca. Contohnya:
type IntUnaryFunc func(int) int func Compose(f, g IntUnaryFunc) IntUnaryFunc { return func(x int) int { return f(g(x)) } } func main() { addOne := func(x int) int { return x + 1 } square := func(x int) int { return x * x } addOneThenSquare := Compose(square, addOne) fmt.Println(addOneThenSquare(2)) // 9 }
Dalam kod di atas, kami mentakrifkan fungsi Compose
untuk menggabungkan dua fungsi. Dengan menggunakan penutupan, kita boleh mencapai kesan f(g(x))
.
Dalam bahasa Go, kami sering menggunakan kata kunci defer
untuk melaksanakan operasi seperti pelepasan sumber. Menggunakan penutupan boleh membantu kami mencapai defer
yang lebih fleksibel dan cekap.
func doSomething() error { f, err := os.Open("filename") if err != nil { return err } defer func() { f.Close() }() // do something }
Dalam kod di atas, apabila menggunakan kata kunci defer
, kita boleh mengakses pembolehubah luaran f
melalui penutupan, dengan itu merealisasikan pengeluaran sumber secara automatik dan mengelakkan risiko terlupa untuk melepaskan sumber.
3. Senario penggunaan fungsi
Selain penutupan, terdapat banyak senario penggunaan lain untuk fungsi dalam bahasa Go.
Pengaturcaraan serentak dalam bahasa Go dilaksanakan melalui gabungan goroutine
dan channel
. Kita boleh menggunakan fungsi untuk memulakan goroutine
dan berkomunikasi melalui channel
.
func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Printf("worker %d starting job %d ", id, j) time.Sleep(time.Second) fmt.Printf("worker %d finished job %d ", id, j) results <- j * 2 } } func main() { jobs := make(chan int, 100) results := make(chan int, 100) // 启动10个worker goroutine for i := 0; i < 10; i++ { go worker(i, jobs, results) } // 发送100个任务 for j := 0; j < 100; j++ { jobs <- j } close(jobs) // 输出结果 for r := range results { fmt.Printf("result: %d ", r) } }
Dalam kod di atas, kami mentakrifkan fungsi worker
untuk memulakan tugasan serentak. Dengan berkomunikasi dengan channel
, kami boleh mencapai kerjasama yang cekap bagi tugasan serentak.
Fungsi tanpa nama dalam bahasa Go boleh ditakrifkan melalui literal, yang biasanya digunakan untuk memudahkan kod dan melaksanakan beberapa keperluan khas. Sebagai contoh, dalam pelayan HTTP, kami sering menggunakan fungsi tanpa nama untuk mengendalikan penghalaan.
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path)) }) log.Fatal(http.ListenAndServe(":8080", nil)) }
Dalam kod di atas, kami menggunakan fungsi tanpa nama untuk mengendalikan permintaan HTTP. Dengan menggunakan fungsi tanpa nama, kita boleh menulis kod dengan lebih fleksibel dan ringkas.
Kesimpulan
Dalam bahasa Go, fungsi dan penutupan adalah asas untuk mencapai kod berkualiti tinggi. Dengan menggunakan fungsi dan penutupan dengan sewajarnya, kami boleh mencapai kod yang lebih ringkas, cekap dan boleh dibaca, menjadikan program kami lebih elegan dan lebih mudah diselenggara.
Atas ialah kandungan terperinci Senario penggunaan penutupan dan fungsi dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!