Go语言之函数使用(8)闭包

一、基本介绍

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

二、快速入门案例

package main
import "fmt"


func AddUpper(str string) func (int) int {
    var n int = 10
    //var str string = "tom~"
    return func(x int) int {
        n = n + x
        str += " hello "
        fmt.Println("str=", str)
        return n
    }

}

func main() {

    f := AddUpper("jack") // f就是一个函数 func (int) int
    fmt.Println(f(1)) // 11  jack hello
    fmt.Println(f(2)) // 13   jack hello hello
    fmt.Println(f(3)) // 16   jack hello hello hello

}

案例分析:

1)AddUpper会返回一个匿名函数

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

2)该匿名函数引用到其函数外部一个变n

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

3)你匿名函数和它引用到的外部变量n,形成一个整体,构成一个闭包。

4)f(1) , f(2) …即在反复调用闭包。

5)当我们使用闭包时,该匿名函数引用到外部n, 只会被初始化一次,以后调用时,则使用同一n.。

6)你可以这样理解,把闭包看成一个类,匿名函数就相当于方法,而引用到的外部变量就是字段。

7)搞清楚闭包的关键点,就是分析出,该匿名函数引用到外部变量是哪些。

三、闭包最佳实践

1、请编写一个程序,具体要求如下
1) 编写一个函数 makeSuffix(suffix string) 可以接收一个文件后缀名(比如.jpg),并返回一个闭包
2) 调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg) ,则返回 文件名.jpg , 如果已经有.jpg后缀,则返回原文件名。
3) 要求使用闭包的方式完成
4) strings.HasSuffix
2、代码说明
1) 返回的匿名函数和 makeSuffix (suffix string) 的 suffix 变量 组合成一个闭包,因为 返回的函数引用到suffix这个变量
2) 我们体会一下闭包的好处,如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入 后缀名,比如 .jpg ,而闭包因为可以保留上次引用的某个值,所以我们传入一次就可以反复使用。大家可以仔细的体会一把!

package utils

import (
    "strings"
)

/*
1)编写一个函数 makeSuffix(suffix string)  可以接收一个文件后缀名(比如.jpg),并返回一个闭
2)调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg) ,则返回 文件名.jpg , 如果已经有.jpg后缀,则返回原文件名。
3)要求使用闭包的方式完成
4)strings.HasSuffix //提示会使用到函数

*/
// 使用闭包
func MakeSuffix1(suffix string) func(string) string  {
    return func (str string) string  {
        if strings.HasSuffix(str,suffix) {
            return str
        }else {
            return str + suffix
        }
    }
}

// 传统方式
func MakeSuffix2(suffix string, str string) string {


    if strings.HasSuffix(str, suffix) {
        return str
    } else {
        return str + suffix
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值