匿名函数

顾名思义,就是没有名字的函数,很多语言都有,如:java, js, php, 其中js最钟情匿名函数。匿名函数最大的用途就是用来模拟块级作用域,避免数据污染。

下来,我们来看看golang的匿名函数:

  • 不带参数 ```go package main

import ( “fmt” ) func main() { f:=func(){ fmt.Println(“hello world”) } f()//hello world fmt.Printf(“%T\n”, f) //打印 func() }

  1. - 带参数
  2. ```go
  3. // 带参数
  4. package main
  5. import (
  6. "fmt"
  7. )
  8. func main() {
  9. f:=func(args string){
  10. fmt.Println(args)
  11. }
  12. f("hello world") // hello world
  13. }
  • 带返回值 ```go package main

import “fmt”

func main() { f:=func()string{ return “hello world” } a:=f() fmt.Println(a) //hello world }

  1. - 多个匿名函数
  2. ```go
  3. package main
  4. import "fmt"
  5. func main() {
  6. f1,f2:=F(1,2)
  7. fmt.Println(f1(4))//6
  8. fmt.Println(f2())//6
  9. }
  10. func F(x, y int)(func(int)int,func()int) {
  11. f1 := func(z int) int {
  12. return (x + y) * z / 2
  13. }
  14. f2 := func() int {
  15. return 2 * (x + y)
  16. }
  17. return f1,f2
  18. }

闭包

闭包说白了就是函数的嵌套,内层的嵌套可以使用外层函数的所有变量,即使外层函数已经执行完毕。

  1. package main
  2. import "fmt"
  3. func main() {
  4. a := Fun()
  5. d := Fun()
  6. b:=a("hello ")
  7. c:=a("hello ")
  8. e:=d("hello ")
  9. f:=d("hello ")
  10. fmt.Println(b)//worldhello
  11. fmt.Println(c)//worldhello hello
  12. fmt.Println(e)//worldhello
  13. fmt.Println(f)//worldhello hello
  14. }
  15. func Fun() func(string) string {
  16. a := "world"
  17. return func(args string) string {
  18. a += args
  19. return a
  20. }
  21. }

两次调用F(), 维护的不是同一个a变量

参考:
GO 匿名函数和闭包