一、无参函数,将闭包作为返回值
funcAdd2()func(b int)int{returnfunc(b int)int{//注意写法return b +2}}
调用:
g2:=Add2()//这一句下来,即执行了Add2函数,又将Add2中的闭包(也就是返回值函数)传递给了参数g2
fmt.Printf("%d",g2(2))//此时,实参2对标b int传入闭包
二、带参函数,将函数作为返回值
funcAdder(a int)func(b int)int{returnfunc(b int)int{return a + b
}}
调用:
g2:=Adder(1)//这一句下来,实参1对标a int传入Adder函数,将Adder中的闭包传递给g2
fmt.Prinf("%d",g2(2))//此时,实参2对标闭包的b int传入闭包
三、参数寿命问题***funcmain(){var f =Adder()
fmt.Print(f(1)," - ")
fmt.Print(f(20)," - ")
fmt.Print(f(300))}funcAdder()func(int)int{var x int//注意这个变量returnfunc(delta int)int{
x += delta
return x
}}
输出为:1-21-321
通过这个结果可以发现,f接收Adder的返回值闭包之后,f也保留了里面的变量x,并且会随着f的存在一直存在
不会应为某一次f(*)的调用,而重置x的大小
funcAdder(x int)func(int)int 这样也是同样的道理,x作为形参或者直接在内部定义都是一样的效果
闭包应用:斐波那契数列
funcfibonacci()func()int{
froval :=0
postval :=1returnfunc()int{
tempval := froval
froval = postval
postval += tempval
return froval
}}funcmain(){
f :=fibonacci()for i :=0; i <10; i++{
fmt.Println(f())}}
使用闭包调试
//用到了在加强
where :=func(){_, file, line,_:= runtime.Caller(1)
log.SetFlags(log.Llongfile)
log.Printf("%s:%d", file, line)}where()// some codewhere()// some more codewhere()
计算函数运行时间
start := time.Now()longCalculation()//自己的函数
end := time.Now()
delta := end.Sub(start)
fmt.Printf("longCalculation took this amount of time: %s\n", delta)