package main

import "fmt"

func main() {
	// 匿名函数
	f1 := func() {
		fmt.Println("aaa")
	}
	f1()

	// 闭包
	func() {
		fmt.Println("bbb")
	}()

	// 带参数匿名函数
	f2 := func(a int) {
		fmt.Println(a)
	}
	f2(32)

	// 定义匿名函数并调用
	func(i, j int) {
		fmt.Printf("%d -- %d\n", i, j)
	}(10, 20)

	f3 := func(i, j int) (result int) {
		result = i * j
		return
	}(10, 20)
	fmt.Println(f3)
}

闭包捕获外部变量的特点:

        闭包捕获同一个作用域的常量和变量,不管是否超出了作用域,闭包被调用变量就还会存在。闭包放在一个独立的空间,并没有释放。

package main

import "fmt"

func main() {
	a := 10
	b := "string"

	func() {
		// 闭包以引用的方式捕获外部变量
		a = 20
		b = "STRING"
		fmt.Printf("a = %d, b = %s\n", a, b)
	}()
	// 函数内修改后函数外面也被改了
	fmt.Printf("a = %d, b = %s\n", a, b)
}

例:

package main

import "fmt"

// 函数的返回值是一个匿名函数
func test01() func() int {
	var x int
	return func() int {
		x++
		return x * x
	}
}

func main() {
	// 返回的是匿名函数
	f := test01()
	fmt.Println(f())//1
	fmt.Println(f())//4
	fmt.Println(f())//9
	fmt.Println(f())//16
}