Golang——匿名函数and闭包

1.匿名函数就是没有名字的函数
将匿名函数赋给一个变量(函数变量),再通过该变量来调用匿名函数

dfs := func(i int) int {
 ...
}
dfs(1)

2.全局匿名函数

//多个变量定义,可以用()包裹,不用重复写var
var (
    Test_fun = func (n1 int, n2 int) int {
        return n1 - n2
    }
)


3.踩坑
匿名函数递归 :leetcode210

//递归调用会报错
dfs := func(i int) int {
    ...
    dfs(2)
}

//正确方法,先声明
var dfs func(i int) int
dfs = func(i int) int {
    ...
    dfs(2)
}

闭包:
函数+引用的环境,即引用了外部的变量。
https://tiancaiamao.gitbooks.io/go-internals/content/zh/03.6.html

package main

import "fmt"

// 闭包:函数 + 引用的变量
// count函数返回了一个函数类型,这个函数里没有定义变量,而是引用了该函数外部的变量i
func count() func() int {
	//即使count函数return了,这个变量仍然没有被回收,下次调用该变量仍然在,故变量由go自动分配在内存某处,而且肯定不是在栈上(因为栈return后就被回收了),故是在堆上
	//因为i在堆上,所以不是被初始化为0,除非count被调用重新分配
	i := 0
	return func() int {
		i++
		return i
	}
}

func main() {
	//count函数返回的不是一个变量,而是一个函数类型。故打印该numFunc1不是值,而是该函数类型的地址。
	//实际底层闭包的返回值包括两部分:函数地址 + 外部引用的变量地址
	numFunc1 := count()

	fmt.Println(numFunc1())
	fmt.Println(numFunc1())

	numFunc2 := count()
	fmt.Println(numFunc2())
	fmt.Println(numFunc2())
}

你可能感兴趣的:(Golang,golang)