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

go匿名函数和闭包

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

匿名函数

1. 函数也是一种类型,因此可以定义作为一个函数类型的变量

package main

import "fmt"

// 函数作为参数

func add(a, b int) int {
    return a + b
}

func testfunc(a, b int, fun func(int, int) int) int {
    sum := fun(a, b)
    return sum
}

func main() {
    sum := testfunc(2, 3, add)
    fmt.Println(sum)
}

2. 匿名函数即没有名字的函数

注意defer 和匿名函数的使用 

package main

import "fmt"

func add(a, b int) int {
    return a + b

}

// 函数名也可以赋值给变量
func test1() {
    ff := add
    fmt.Printf("ff的类型是%T\n", ff)
    sum := ff(4, 5)
    fmt.Printf("sum is %d \n", sum)
}

/*
ff的类型是func(int, int) int
sum is 9
*/

// 匿名函数
func test2() {
    f1 := func(a, b int) int {
        return a + b
    }
    fmt.Printf("f1的类型是%T\n", f1)
    sum := f1(4, 5)
    fmt.Printf("sum is %d \n", sum)
}

/*
f1的类型是func(int, int) int
sum is 9
*/

// defer
func test3() int {
    i := 10
    defer fmt.Printf("defer i is %d\n", i)
    i = 100
    fmt.Printf("i is %d\n", i)
    return i
}

/*
i is 100
defer i is 10
return i is 100
*/

// defer 和匿名函数
func test4 () int {
    i:= 10
    defer func() {
        fmt.Printf("defer i is %d \n", i)
    }()

    i= 100
    fmt.Printf("i is %d\n", i)

    return i
}

/*
i is 100
defer i is 100
return i is 100
*/
-.


func main() {
    // test1()

    // test2()

    // i := test3()
    // fmt.Printf("return i is %d", i)

    i := test4()
    fmt.Printf("return i is %d", i)
}

 

 

闭包

一个函数和与其相关的引用环境组合组成的实体

个人认为go中的闭包和python中的闭包概念一样 都是 一个外层函数 嵌套 一个内层函数  内层函数包含对外层函数变量的引用 外层 函数返回值为内层函数的函数名

 

闭包 举例

package main

import (
    "fmt"
    "strings"
    "time"
)

func test1() func(int) int {
    index := 10
    return func(d int) int {
        index += d
        return index
    }

}

func test2(base int) func(int) int {
    return func(a int) int {
        base += a
        return base
    }
}

func test3(suffix string) func(name string) string {
    return func(name string) string {
        if !strings.HasSuffix(name, suffix) {
            // return name+suffix
            return fmt.Sprintf("%s%s", name, suffix)
        }
        return name
    }
}

func test4(a int) (func(int) int, func(int) int) {

    add := func(b int) int {
        a += b
        return a
    }

    sub := func(c int) int {
        a -= c
        return a
    }

    return add, sub
}


func test5(){
    for i:=0; i<=5;i++{
        go func(){
            fmt.Println()
        }()
    }
    time.Sleep(time.Second)
}


func test6(){
    for i:=0; i<=5;i++{
        go func(a int){
            fmt.Println(a)
        }(i)
    }
    time.Sleep(time.Second)
}

func main() {
    // f := test1()
    // fmt.Printf("f(1) return is %d\n", f(1))  // 11
    // fmt.Printf("f(2) return is %d\n", f(2))  //13
    // fu := test1()
    // fmt.Printf("fu(1) return is %d\n", fu(5))  // 15
    // fmt.Printf("fu(2) return is %d\n", fu(6))  //21

    // f := test2(5)
    // fmt.Printf("f(1) return is %d\n", f(1)) // 6
    // fmt.Printf("f(2) return is %d\n", f(2)) //8
    // fu := test2(10)
    // fmt.Printf("fu(1) return is %d\n", fu(5)) // 15
    // fmt.Printf("fu(2) return is %d\n", fu(6)) //21

    // f3 := test3(".jpg")
    // fmt.Printf("f3('ctz') return is %s\n", f3("ctz")) // f3('ctz') return is ctz.jpg
    // fmt.Printf("f3('yunnan.jpg') return is %s\n", f3("yunnan.jpg")) //f3('yunnan.jpg') return is yunnan.jpg


    // add, sub := test4(10)

    // fmt.Println(add(5), sub(6)) //15 9
    // fmt.Println(add(3), sub(4)) // 12 8

    test5()


}

 

 

 


鲜花

握手

雷人

路过

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

请发表评论

全部评论

专题导读
上一篇:
[Go 笔记]关于 Panic和 Recover发布时间:2022-07-10
下一篇:
GoWeb开发之Revel-参数绑定发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

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

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

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