闭包
go 中实现闭包需要依赖 匿名函数
package main
import (
"fmt"
)
func foo(name string) func() {
return func() {
fmt.Println("hello", name)
}
}
func main() {
f := foo("siri") // 执行这段代码, 拿到的是一个函数名
f() // 调用闭合范围内函数
}
装饰器模式
go 支持装饰器模式,实现上同其他语言略有不同
package main
import (
"fmt"
)
type Decore func(string) func()
func foo(name string) func() { // 这里 实现了 闭包 + 装饰器模式。闭包不是必须的
fmt.Println("hello", name)
return func() {
fmt.Println("hello", name)
}
}
func changeFoo(d Decore) Decore {
return func(name string) func() {
fmt.Println("change after")
res := d(name)
fmt.Println("change before")
return res
}
}
func main() {
foo("seine")
var foo Decore = changeFoo(foo) // 执行这段代码, 拿到的是一个函数名. 由于Go没有Python中那样的语法糖,因此只能手动重新赋值给同名的变量
foo("siri") // 这里并没有改变原来的函数和其调用方式
}
hello seine
change after
hello siri
change before
标签:闭包,name,fmt,Println,func,go,foo,装饰
From: https://www.cnblogs.com/notes201432273/p/16656308.html