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

你可能感兴趣的:(编程语言go)