匿名函數就是沒有函數名的函數,以下所示。閉包
func test() int { max := func(a, b int) int { if a > b { return a } else { return b } }(3, 4) return max } func main() { primeCnt := make(chan int, 1) N := 10 go func(N int) { cnt := 0 for i := 2; i < N; i++ { var j int for j = 2; j <= int(math.Sqrt(float64(i))); j++ { if i%j == 0 { break } } if j > int(math.Sqrt(float64(i))) { cnt++ fmt.Println(i) } } primeCnt <- cnt }(N) fmt.Println("totalNum:", <-primeCnt) }
基本上匿名函數也沒啥好說的 。。。函數
閉包感受就是返回值爲匿名函數的函數。。。來看個例子吧 (◉3◉)工具
package main import ( "fmt" ) func squares() func() int { var x int return func() int { x++ return x * x } } func main() { f := squares() fmt.Println(f()) fmt.Println(f()) fmt.Println(f()) }
運行結果以下所示,能夠看到三次調用f(),得到的是不一樣的x。即使是x是squares的局部變量,可是變量x的生命週期被延長到了三次函數調用( f() )。這是爲何呢?讓咱們在看看另外一種狀況。post
package main import ( "fmt" ) func squares() func() int { var x int return func() int { x++ return x * x } } func main() { f := squares() f1 := squares() fmt.Println(f()) fmt.Println(f()) fmt.Println(f()) fmt.Println(f1()) fmt.Println(f1()) fmt.Println(f1()) }
看到了吧。換個變量就又從新開始了。嘿嘿嘿。爲何會這樣,一句話,內存逃逸。什麼是內存逃逸,簡單地說就是原本在棧上的變量又跑到堆裏去了。固然這麼講過於簡單了,改天再寫一文談談內存逃逸給各位太君,嘿嘿嘿。那麼怎麼才能檢測程序有沒有發生內存逃逸呢。go build工具就歐克了。以下圖所示。ui
從圖中咱們能夠看到變量x被移動到了堆中,這也就解釋了爲何x的生命週期能夠被延長。spa
http://www.javashuo.com/article/p-duhoryld-gs.html 關於閉包的分析設計
《Go程序設計語言》code
https://www.do1618.com/archives/1328/go-%E5%86%85%E5%AD%98%E9%80%83%E9%80%B8%E8%AF%A6%E7%BB%86%E5%88%86%E6%9E%90/ 關於內存逃逸的分析blog