• 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 }
  • 相关阅读:
    检验Excel中数据是否与数据库中数据重复
    C# 上传文件
    asp.net Excel导入和导出
    完整ASP.Net Excel导入
    C#遍历指定文件夹中的所有文件
    C#获取文件夹下的所有文件的文件名
    UITextField 文本框 只能输入数字 且保留2位小数 实现
    Asp.Net生成无限级菜单
    给Repeater增加button事件,并绑定值
    简洁的Asp.net菜单控件
  • 原文地址:https://www.cnblogs.com/xwxz/p/13304040.html
Copyright © 2020-2023  润新知