Go语言中的闭包(附带实例)
在 Go 语言中,闭包是引用外部变量的函数,变量不在这个函数中定义,而是在定义函数的环境中定义。被引用的外部变量和函数一同存在,即使已经离开了引用外部变量的环境,在闭包中仍然可以继续使用这个外部变量。
例如,使用闭包计算购买商品的总价,代码如下:
在主函数中两次调用 getTotal() 函数,函数返回值以变量 fruit 和 vegetable 表示,变量 fruit 和 vegetable 是匿名函数的函数变量,通过这两个变量实现匿名函数的调用。两次调用 getTotal() 函数形成两个不同的闭包,分别计算购买水果和蔬菜的总价。
在该示例中,闭包除了使用 getTotal() 函数定义的变量,还可以使用 getTotal() 函数的参数作为引用的外部变量。
例如,使用闭包计算购买商品的总价,代码如下:
package main import ( "fmt" ) func getTotal() func(name string, price float64) float64 { // 商品总价 var total float64 // 返回闭包函数 // 返回闭包函数 return func(name string, price float64) float64 { fmt.Printf("商品名称:%s 价格:%v\n", name, price) // 计算商品总价 total = total + price // 返回商品总价 return total } } func main() { fruit := getTotal() // 水果总价 fmt.Println("水果总价:", fruit("苹果", 15.6)) fmt.Println("水果总价:", fruit("香蕉", 17.6)) vegetable := getTotal() // 蔬菜总价 fmt.Println("蔬菜总价:", vegetable("黄瓜", 9.2)) fmt.Println("蔬菜总价:", vegetable("菠菜", 6.9)) }运行结果如下:
商品名称:苹果 价格:15.6
商品名称:香蕉 价格:17.6
水果总价:33.2
商品名称:黄瓜 价格:9.2
商品名称:菠菜 价格:6.9
蔬菜总价:16.1
在主函数中两次调用 getTotal() 函数,函数返回值以变量 fruit 和 vegetable 表示,变量 fruit 和 vegetable 是匿名函数的函数变量,通过这两个变量实现匿名函数的调用。两次调用 getTotal() 函数形成两个不同的闭包,分别计算购买水果和蔬菜的总价。
在该示例中,闭包除了使用 getTotal() 函数定义的变量,还可以使用 getTotal() 函数的参数作为引用的外部变量。