能够把函数赋值给变量,能够把函数做为其余函数的参数或者返回值,就是Go中头等函数的机制。闭包
Func main(){ a := func(){ print } a() }
a函数没有名称,这类函数称为匿名函数。函数
经过如下语法自定义函数类型:code
type add func(a int ,b int) int
使用:匿名函数
Func main(){ var a add = func(a int, b int) int{ return a + b } s := a(5, 6) print s }
将自定义函数类型赋值给a,以后能够调用a。变量
高阶函数知足下列之必定义:语法
Func simple(a func(a, b int) int){ print a(60, 7) } Func main(){ f := func (a, b int) int{ return a + b } simple(f) }
func fimple() func(a, b int) int{ f := func(a, b int) int{ return a +b } return f } func main(){ s := simple() print s(60, 7) }
闭包是匿名函数一个特例,当一个匿名函数所访问的变量定义在函数体外部时,这样的匿名函数称为闭包。方法
func main(){ a := 5 func() { print a }() }
上面例子中在匿名函数中访问了变量a,a存在匿名函数外部,这个匿名函数就是闭包。im
每一个闭包都会绑定一个它本身的外围变量。co
含有defer语句的函数,会在方法返回以前,调用defer修饰的函数。return
func finished(){ print 111 } func largest(){ defer finished() print 222 } 执行结果为:222,111
Largest方法开始执行,在largest方法返回以前会调用defer修饰的finished方法。
延迟函数的参数求值是在主函数顺序执行到defer语句的时候,而不是延迟函数执行的时候。