go 闭包

作者: StevenQin | 来源:发表于2019-02-28 15:09 被阅读0次
  • 基本介绍

闭包就是一个函数和与其相关的引用环境组合的一个整体(实体)

案例:

package main

import (
    "fmt"
)

//累加器函数 (返回的是一个匿名函数func (int) int)
func AddUpper() func(int) int {
    var n int = 10
    return func(x int) int {
        n = n + x
        return n
    }
}

func main() {
    f := AddUpper()
    fmt.Println(f(1))
    fmt.Println(f(2))
    fmt.Println(f(3))
    fmt.Println(AddUpper()(10))
    fmt.Println(AddUpper()(20))
}

说明:
1、AddUpper是一个函数,返回的数据类型是fun (int) int
2、闭包的说明

    var n int = 10
    return func(x int) int {
        n = n + x
        return n
    }

返回的是一个匿名函数,匿名函数引用到函数外的n ,因此这个匿名函数和n就形成了一个整体,构成闭包。

3、这样理解:闭包是一个类,函数是操作,n是字段 函数和它使用到的n构成一个闭包
4、当我们反复的调用f函数时,n只会初始化一次,因些每调用一次就会累加。
5、闭包的关键就是要分析出返回的函数它使用(引用到的变量),因为函数和它引用到的变量共同构成闭包。

//累加器函数 (返回的是一个函数func (int) int)
func AddUpper() func(int) int {
    var n int = 10
    var str = "hello"
    return func(x int) int {
        n = n + x
        str += string(36)
        fmt.Println("str=", str)
        return n
    }
}
func main() {
    f := AddUpper()
    fmt.Println(f(1))
    fmt.Println(f(2))
    fmt.Println(f(3))
    fmt.Println(AddUpper()(10))
    fmt.Println(AddUpper()(20))
}
  • 最佳实践

1、编写函数 makeSuffix(suffix string),可以接收一个文件后缀名(比如.jpg),并返回一个闭包
2、调用闭包,传入一个文件名,如果没有指定后缀,则返回 文件名.jpg,如果有后缀,则返回文件名
3、全用strings.hasSuffix 函数来判断某个字符串是否有指定的后缀。

package main
import (
    "fmt"
    "strings"
)

//编写函数 makeSuffix(suffix string),可以接收一个文件后缀名(比如.jpg),并返回一个闭包
//调用闭包,传入一个文件名,如果没有指定后缀,则返回 文件名.jpg,如果有后缀,则返回文件名
//全用 strings.hasSuffix 函数来判断某个字符串是否有指定的后缀。

func makeSuffix(suffix string) func(string) string {
    return func(name string) string {
        //如果name没有后缀,则name + suffix
        if !strings.HasSuffix(name, suffix) {
            return name + suffix
        }
        //如果有就直接 返回 name
        return name
    }
}
func main() {
    f := makeSuffix(".jpg")
    fmt.Println("文件名是:", f("cat"))
    fmt.Println("文件名是:", f("bird.jpg"))
    fmt.Println("文件名是:", f("mouse.avi"))
    fmt.Println("文件名是:", makeSuffix(".mp3")("song.mp3.mp4"))
}

说明:
1、返回的匿名函数引用到了 makeSuffix(suffix string) 函数的suiffix变量,形成了一个闭包。
2、我们体会一下闭包的好处,使用传统的方式,每次都要传入一个后缀名,(除非用全局变量),使用闭包的好处是,可以不用全局变量,不用反复传入后缀名.jpg
3、

相关文章

  • 第02天(函数、工程管理)_03

    11_函数类型.go 12_回调函数.go 13_匿名函数和闭包.go 14_闭包捕获外部变量的特点.go 15_...

  • golang

    golang中闭包的问题 熟悉go语言的开发者都知道,go的闭包是可以记录状态的。当我想用闭包来实现保存某一str...

  • go闭包

    这里的函数接受了一个int参数,返回了一个匿名函数。在调用addn时,返回了就是一个函数,需要再次传参调用执行。其...

  • go闭包

    闭包简单的说就是一个匿名函数+外部变量的引用,举例如下 示例一 package main import ( "...

  • go 闭包

    1.闭包的概念闭包并不是什么新奇的概念,它早在高级语言开始发展的年代就产生了。闭包(Closure)是词法闭包(L...

  • go闭包

    Go语言中闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放… ...

  • go 闭包

    基本介绍 闭包就是一个函数和与其相关的引用环境组合的一个整体(实体) 案例: 说明:1、AddUpper是一个函数...

  • go语言 闭包

  • Go之闭包

    闭包(closure): 一个外层函数中,有内层函数,该内层函数中,会操作外层函数的局部变量(外层函数中的参数,或...

  • 26. 函数闭包

    如果非必要,尽量不要在程序中使用闭包。go函数可以是一个闭包。闭包是一个函数值,它引用了函数体之外的变量。这个函数...

网友评论

      本文标题:go 闭包

      本文链接:https://www.haomeiwen.com/subject/koghuqtx.html