Go语言中的闭包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
func makeSuffixFunc(suffix string) func(string) string {
return func(str string) string {
if !strings.HasSuffix(str, suffix) {
return str + suffix
}
return str
}
}

func adder() func(int) int {
var x int = 0
return func(val int) int {
x += val
return x
}
}

func main() {
f := adder()
fmt.Println(f(1))
fmt.Println(f(100))
fmt.Println(f(1000))

f1 := makeSuffixFunc(".jpg")
fmt.Println(f1("123"))
f2 := makeSuffixFunc(".txt")
fmt.Println(f2("hello"))
}
-----------------------------------print:
1
101
1101
123.jpg
hello.txt
  • 闭包可以读取函数内部的变量,并且会让这个变量始终保存在内存中

使用闭包的注意点

  • 由于闭包会使函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则可能会造成性能问题,还可能会导致内存泄漏
  • 不要随便修改父函数中的内部变量!!!!!