Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Senario penggunaan penutupan dan fungsi dalam bahasa Go

Senario penggunaan penutupan dan fungsi dalam bahasa Go

王林
王林asal
2023-06-01 08:56:111188semak imbas

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

  1. Pengaturcaraan fungsional

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)).

  1. Pelaksanaan tertunda

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.

  1. Pengaturcaraan serentak

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.

  1. Fungsi tanpa nama

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!

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