Go语言学习笔记十--Go语言函数的闭包与案例

一、函数的闭包基本内容

 1 package main
 2 
 3 import "fmt"
 4 
 5 // 闭包 : 一个函数与其相关的引用环境组合而成的实体
 6 
 7 //Adder 这个函数的返回值为一个类型为func(int) int的函数 这就是组成了一个闭包
 8 func Adder() func(int) int {
 9     var x int
10     return func(d int) int {
11         x += d
12         return x
13     }
14 }
15 func main() {
16     //注意 "f = Adder()" 和 "f = Adder" 的区别
17     var f = Adder() //这里其实是返回到那个匿名函数 f称之为这个匿名函数的闭包
18 
19     fmt.Println(f(1))
20     fmt.Println(f(20))
21     fmt.Println(f(300))
22     //因为f还是在生命周期内,所以以上三个调用Adder中,并且公用一个x
23 
24     //调用f函数不写参数会报错
25     //fmt.Println(f())
26 
27     //新开一个闭包,这里面是的是f1的x
28     var f1 = Adder()
29     fmt.Println("f1(500)的值为:",f1(500))
30     fmt.Println("f1(20)的值为:",f1(20))
31     //两者之间的x互不影响
32     fmt.Println("f(40)的值为:",f(40))
33 
34 }

二、案例一

 1 package main
 2 
 3 //闭包的例子2
 4 func add(num int) func(int) int {
 5     return func(i int) int {
 6         return i + num
 7     }
 8 }
 9 
10 func main() {
11     f := add(10)
12     println(f(10),f(20),f(2)) //思考思考输出是什么呢?
13 
14     f1 := add(200)
15     println(f1(10))
16     println(f1(20))
17     println(f1(-12))
18 }

三、案例二

 1 package main
 2 
 3 import "time"
 4 
 5 func main() {
 6     //上面这个匿名函数一直使用的是外面的i
 7     for i:=0; i<5; i++ {
 8         go func() {
 9             println(i)
10         }()
11     }
12     time.Sleep(time.Second*1)
13     println("-------上面执行结束--------")
14 
15     //这里是将i作为参数传入闭包函数
16     for i:=0; i<5; i++ {
17         go func(index int) {
18             println(index)
19         }(i)
20     }
21     time.Sleep(time.Second*1)
22     println("-------下面执行结束--------")
23 }

四、案例三 -后缀匹配

 1 package main
 2 
 3 import "strings"
 4 
 5 //判断后缀 Suffix函数传一个后缀,匹配name是否有这个后缀 如果没有就加上
 6 func SuffixFunc(str string) func(string) string {
 7     return func(name string) string {
 8         if !strings.HasSuffix(name,str) {
 9             return name + str
10         }
11         return name
12     }
13 }
14 //上面的函数可以写成下面这样子 意思差不多吧
15 func hasSuffix(str string, rear string) string {
16     if !strings.HasSuffix(str, rear) {
17         return str + rear
18     }
19     return str
20 }
21 func main() {
22     suffix1 := SuffixFunc(".jpg")
23     suffix2 := SuffixFunc(".png")
24 
25     println(suffix1("001"))
26     println(suffix1("002.jpg"))
27     println(suffix2("003"))
28     println(suffix2("004.png"))
29 
30     println("非常的好用,就是麻烦了一点,例如我可以这样子写")
31 
32     str1 := "123"
33     str2 := "456.jpg"
34     rear := ".jpg"
35     //res := strings.HasSuffix(str1,rear) ? str1 : str1 + rear 居然不支持三目运算符?
36     println(hasSuffix(str1, rear))
37     println(hasSuffix(str2,rear))
38 }
原文地址:https://www.cnblogs.com/xwxz/p/13304040.html