一、函数的闭包基本内容
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 }