• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

一、函数的闭包基本内容

 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 }

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap