函數閉包與 goroutine 在 go 語言中協作,創造并發、高效的程序:函數閉包允許函數訪問外部變量,即使函數已執行完畢。goroutine 是輕量級協程,可以并行執行。將函數閉包與 goroutine 結合使用,為并發執行提供強大機制。實例:并行處理數組元素,通過函數閉包創建 goroutine 計算每個元素平方,再通過通道累積結果。
Go 語言中的函數閉包與 Goroutine 的協作
在 Go 語言中,函數閉包和 Goroutine 是兩個強大的元素,它們可以協同工作,創建并發和高效的程序。本文將探索如何使用函數閉包和 Goroutine 協作來提高應用程序的性能和可維護性。
函數閉包
函數閉包是指能夠訪問其定義范圍之外變量的函數。在 Go 中,通過創建匿名函數并將其存儲在變量中,可以創建函數閉包。
例如:
func createCounter() func() int {
count := 0
return func() int {
count++
return count
}
}
登錄后復制
上面的函數 createCounter 創建了一個函數閉包,它返回一個匿名函數。此匿名函數可以訪問并修改外部變量 count,即使在 createCounter 函數執行完畢后也是如此。
Goroutine
Goroutine 是 Go 語言中的輕量級并發執行單元。它們本質上是協程,可以在不阻塞主線程的情況下并行執行。Goroutine 可以通過 go 關鍵字創建。
例如:
go func() {
for i := 0; i < 10; i++ {
// 在 Goroutine 中執行的操作
}
}
登錄后復制
將 Goroutine 與函數閉包結合使用,可以為并發執行創建強大的機制。
實戰案例
以下是一個實戰案例,展示函數閉包和 Goroutine 協作的用法:
// 并行處理數組元素
func parallelSum(arr []int) int {
// 創建一個通道來接收各個 Goroutine 的結果
resCh := make(chan int)
// 遍歷數組元素并為每個元素創建一個 Goroutine
for _, num := range arr {
go func(n int) {
// 計算元素的平方,并將其發送到通道
resCh <- n * n
}(num)
}
// 初始化 sum 變量并等待各個 Goroutine 完成
sum := 0
for i := 0; i < len(arr); i++ {
sum += <-resCh
}
// 返回平方元素的總和
return sum
}
登錄后復制
在上面的示例中,parallelSum 函數采用一個整數數組,并并行計算每個元素的平方。函數閉包用于創建一個 Goroutine,該 Goroutine 計算單個元素的平方并將其發送到通道中。主 Goroutine 等待所有 Goroutine 完成并累積結果,然后返回最終總和。
通過利用函數閉包和 Goroutine,我們能夠快速高效地執行并行計算,而不阻塞主線程。這顯著提高了代碼性能和響應性。






