異同分析:匿名函數和閉包都是沒有名稱的函數,可立即調用或分配給變量。不同的是,閉包捕捉外部作用域變量,允許內部函數訪問和修改外部變量,而匿名函數則不行。
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
登錄后復制