写点什么

【一 Go 到底】第二十天 --- 闭包

作者:指剑
  • 2022-10-20
    重庆
  • 本文字数:832 字

    阅读完需:约 1 分钟

【一Go到底】第二十天---闭包

一、闭包

1.1 闭包介绍

闭包就是一个函数和与其相关的引用环境组合的一个整体(实体)闭包:类函数:操作n: 字段

1.2 案例演示

package main
import "fmt"
// 累加器// 返回的数据类型是 fun(int) int,是一个匿名函数// 该匿名函数引用到了函数外的 n ,因此该匿名函数和n组成一个整体,构成闭包// 函数和它使用到的n构成闭包func AddUpper() func(int) int { // 仅初始化一次 var n int = 10 return func(i int) int { n += i return n
}}
func main() { f := AddUpper() // 反复调用f函数时,n仅初始化一次,因此每调用一次就进行一次累加 fmt.Println(f(1)) fmt.Println(f(2)) fmt.Println(f(3))
}
复制代码

2.闭包最佳实践

  1. 编写一个函数 makeffix(suffix string)可以接收一个文件后缀名(比如.jpg),并返回一个闭包

  2. 调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg) ,则返回文件名.jpg,如果已经有.jpg 后缀,则返回原文件名。

  3. 要求使用闭包的方式完成

  4. strings.HasSuffix 判断是否有指定后缀


package main
import ( "fmt" "strings")
func makeSuffix(suffix string) func(string) string { return func(name string) string { // 如果name 没有指定的后缀,就机上,否则,返回原来的名字 if strings.HasSuffix(name, suffix) == false { return name + suffix }
return name }}func main() { // 测试makeSuffix
// 先返回闭包 // 如果使用闭包仅传一次就可以 s := makeSuffix(".jpg") fmt.Println("文件名处理后 = ", s("winter")) fmt.Println("文件名处理后 = ", s("winter--2.jpg"))
}
复制代码


案例说明


  1. 返回的函数和 makeSuffx (suffix string)的 suffx 变量和返回的函数组合成一个闭包,因为返回的函数引用到 suffix 这个变量

  2. 闭包的好处,如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入后缀名,比如.jpg ,而闭包因为可以保留上次引用的某个值,所以我们传入一次就可以反复使用。


`

发布于: 刚刚阅读数: 4
用户头像

指剑

关注

InfoQ签约作者 2022-07-13 加入

AWS Community Builder,AWS Student Ambassador,阿里云专家博主,OPS社区创始成员

评论

发布
暂无评论
【一Go到底】第二十天---闭包_Go_指剑_InfoQ写作社区