go语言之闭包

代码示例

package main

import (
	"fmt"
	"strings"
)

func main() {
	// 匿名函数,不能够独立存在(编译器会返回错误:non-declaration statement outside function body)
	// 可以被赋值于某个变量,即保存函数的地址到变量中
	// 然后通过变量名对函数进行调用
	test := func(x, y int) {fmt.Println(x+y)}
	test(1,3)

	// 直接调用匿名函数
	// 表示参数列表的第一对括号必须紧挨着关键字 func,因为匿名函数没有名称
	// 花括号 {} 涵盖着函数体
	// 最后的一对括号表示对该匿名函数的调用
	func(x,y int) {fmt.Println(x+y)}(1,4)

	// 将函数作为返回值
	// 闭包函数保存并积累其中的变量的值,不管外部函数退出与否,它都能够继续操作外部函数中的局部变量。
	var f = Adder()
	fmt.Print(f(10), " - ")
	fmt.Print(f(20), " - ")
	fmt.Println(f(30))

	// 一个返回值为另一个函数的函数可以被称之为工厂函数
	addBmp := MakeAddSuffix(".bmp")
	addJpeg := MakeAddSuffix(".jpeg")
	fmt.Println(addBmp("file")) // returns: file.bmp
	fmt.Println(addJpeg("file")) // returns: file.jpeg
}

// 求和
func Adder() func(int) int {
	var x int
	return func(delta int) int {
		x += delta
		return x
	}
}

// 添加后缀
func MakeAddSuffix(suffix string) func(string) string {
	return func(name string) string {
		if !strings.HasSuffix(name, suffix) {
			return name + suffix
		}
		return name
	}
}

运行结果:

4
5
10 - 30 - 60
file.bmp
file.jpeg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值