zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    python Database Poll for SQL SERVER
    SQLAlchemy表操作和增删改查
    flask动态url规则
    flask配置管理
    一个Flask运行分析
    Function Set in OPEN CASCADE
    Happy New Year 2016
    Apply Newton Method to Find Extrema in OPEN CASCADE
    OPEN CASCADE Multiple Variable Function
    OPEN CASCADE Gauss Least Square
  • 原文地址:https://www.cnblogs.com/xwxz/p/13304040.html
Copyright © 2011-2022 走看看