異同分析:匿名函數和閉包都是沒有名稱的函數,可立即調用或分配給變量。不同的是,閉包捕捉外部作用域變量,允許內部函數訪問和修改外部變量,而匿名函數則不行。
Go 語言中的匿名函數與閉包的異同分析
匿名函數
匿名函數是不包含名稱的函數。它們通常以 func 關鍵字開始,后跟參數列表和函數體。匿名函數可以立即調用,也可以賦值給變量或傳遞給其他函數。
代碼示例:
// 匿名函數
func() {
fmt.Println("匿名函數")
}
登錄后復制
閉包
閉包是捕捉周圍作用域中變量的匿名函數。這允許內部函數訪問和修改其外部作用域中的變量,即使外部函數已返回。閉包通常用于創建具有狀態或共享數據的函數。
代碼示例:
// 閉包
func increment() func() int {
var i int
return func() int {
i++
return i
}
}
登錄后復制
異同
相同點:
匿名函數和閉包都是沒有名稱的函數。它們都可以立即調用或分配給變量。
不同點:
匿名函數不捕捉外部作用域中的變量,而閉包則可以。閉包可以訪問和修改其外部作用域中的變量,而匿名函數只能訪問其自己的作用域中的變量。匿名函數通常用于執行一次性任務,而閉包用于創建具有狀態或共享數據的函數。
實戰案例:創建具有共享狀態的計數器
使用閉包,我們可以創建一個具有共享狀態的計數器:
// 閉包計數器
func makeCounter() func() int {
var count int
return func() int {
count++
return count
}
}
func main() {
counter := makeCounter()
for i := 0; i < 5; i++ {
fmt.Println(counter())
}
}
登錄后復制
輸出:
1 2 3 4 5
登錄后復制






