golang的匿名函數和普通函數的區別解析
golang的匿名函數和普通函數的區別
匿名函數是不具名的函數,可以在不定義函數名的情況下直接使用,通常用於函數內部的局部作用域中。而普通函數則是通過定義函數名,在任何地方都可以直接調用的函數。
在 Go 中,匿名函數與普通函數有以下區別:
- 匿名函數可以在函數內部定義,普通函數隻能在包級別定義;
- 匿名函數可以在定義後立即調用,也可以賦值給一個變量後再調用,而普通函數隻能通過函數名調用;
- 匿名函數可以訪問並修改外部變量,即閉包特性,而普通函數隻能訪問參數和全局變量;
- 匿名函數可以作為函數參數傳遞,也可以作為函數返回值,而普通函數隻能作為函數參數傳遞。
例如,以下代碼使用瞭匿名函數:
package main import "fmt" func main() { func() { fmt.Println("Hello, World!") }() }
在這個例子中,我們定義瞭一個匿名函數,並在函數定義後立即調用。該匿名函數沒有名稱,沒有參數,沒有返回值,僅僅打印 “Hello, World!”。由於該函數是在 main 函數內部定義的,因此隻能在 main 函數內部調用,外部無法訪問。
匿名函數可以訪問並修改外部變量,即閉包特性:
s := []string{"我喜歡", "鄧文怡"} func(){ s[1] = "編程" s = append(s, "和", "寫作") }() for _, v := range s { print(v, " ") } // 我喜歡 編程 和 寫作
在這個例子中,我們定義瞭一個字符串切片 s,包含兩個元素 “我喜歡” 和 “鄧文怡”。然後定義瞭一個匿名函數,並在函數定義後立即調用。在該匿名函數中,我們將 s 切片的第二個元素修改為 “編程”,並將 “和” 和 “寫作” 兩個元素添加到 s 切片的末尾。最後,通過使用 range 循環遍歷 s 切片的每個元素,並將其打印出來。因此,打印輸出的結果為 “我喜歡 編程 和 寫作”。值得註意的是,由於該匿名函數是在 main 函數內部定義的,因此隻能在 main 函數內部調用,外部無法訪問。
由於該匿名函數是在 main 函數內部定義的,因此可以訪問和修改 s 切片。在該匿名函數定義時,它引用瞭變量 s,因此它形成瞭一個閉包,即該匿名函數“捕獲”瞭在其定義范圍內聲明的變量 s。所以,在匿名函數中修改 s 切片的值也影響到瞭 main 函數中 s 切片的值。 這就是匿名函數的閉包特性:函數可以訪問並修改其定義范圍內的變量。
補充:Golang的匿名函數
golang中的匿名函數 golang中的匿名函數1.匿名函數介紹2.匿名函數使用方式2.1定義時直接調用2.2將匿名函數賦值給一個變量2.3定義全局匿名函數
golang中的匿名函數
1.匿名函數介紹
golang支持匿名函數,如果某些函數僅想在特定位置使用一次,那麼可以考慮使用匿名函數。
匿名函數也可以實現多次調用。
2.匿名函數使用方式
2.1定義時直接調用
示例代碼:
package main import ( "fmt" ) func main() { fmt.Println("Hello World!"); //匿名函數使用方式1:定義時直接調用。 //(num1 int,num2 int),形參前不寫函數名,並在函數後直接調用。 res := func (num1 int,num2 int) int { return num1 + num2 }(2,3) fmt.Printf("res的值為:%v",res) }
結果:
2.2將匿名函數賦值給一個變量
示例代碼:
package main import ( "fmt" ) func main() { fmt.Println("Hello World!"); //匿名函數使用方式2:將匿名函數賦值給變量,使用變量調用。 add := func (num1 int,num2 int) int { return num1 + num2 } //通過函數變量 調用函數。 res := add(2,3) fmt.Printf("add的類型為:%T,res的值為:%v",add,res) }
結果:
add的類型為 函數 func(int,int) int 類型。
2.3定義全局匿名函數
package main import ( "fmt" ) //匿名函數使用方式3:將函數賦值給全局變量。 var Add = func (num1 int,num2 int) int{ return num1 + num2 } func main() { fmt.Println("Hello World!"); res := Add(2,3) fmt.Printf("Add全局變量的類型:%T,res的類型:%T,res的值為:%v",Add,res,res) }
結果:
到此這篇關於golang的匿名函數和普通函數的區別的文章就介紹到這瞭,更多相關go匿名函數內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 詳解Golang中字符串的使用
- 聊聊Golang的語言結構和變量問題
- Golang中for循環的用法示例詳解
- golang 字符串切片去重實例
- Go語言中 Print Printf和Println 的區別解析