·  阅读 902

# Go语言闭包研究

## 什么是闭包

``````package main

import "fmt"

func inc() func() int {	//返回值为函数闭包
var x int
return func() int {
x++
return x
}
}

func main(){
i := incr()	//i被赋值为函数闭包，i内保存了x的状态
fmt.printLn(i())	// 1
fmt.printLn(i())	// 2
fmt.printLn(i())	// 3

fmt.printLn(incr()())	//1
fmt.printLn(incr()())	//1
fmt.printLn(incr()())	//1

return
}

## 闭包引用

``````x := 1
f := func() {
println(x)
}()	//等价于定义之后调用一次f(), 输出1
x = 2
f()	// 2
x = 3
f()	// 3

## 进阶实例

``````var funcSlice []func()
for i := 0; i < 3; i++ {
funcSlice = append(funcSlice, func() {
println(i)
})
}
for j := 0; j < 3; j++ {
funcSlice[j]()
}

5

4

3

2

1

0

``````var funcSlice []func()
for i := 0; i < 3; i++ {
funcSlice = append(funcSlice, func() {
println(&i)
})
}
for j := 0; j < 3; j++ {
funcSlice[j]()
}

### 一、声明新变量

``````var funcSlice []func()
for i := 0; i < 3; i++ {
funcSlice = append(funcSlice, func() {
Output := i
println(Output)
})
}
for j := 0; j < 3; j++ {
funcSlice[j]()
}

### 二、声明新函数并传参

``````var funcSlice []func()
for i := 0; i < 3; i++ {
func(i int) {
funcSlice = append(funcSlice, func() {
println(i)
})	//闭包
}(i)	//闭包并调用
}
for j := 0; j < 3; j++ {
funcSlice[j]()	//调用
}

Go语言闭包详解