共计 1130 个字符,预计需要花费 3 分钟才能阅读完成。
简略装璜器
咱们通过一个简略的例子来看一下装璜器的简略利用,首先编写一个 hello
函数:
package main
import "fmt"
func hello() {fmt.Println("Hello World!")
}
func main() {hello()
}
实现下面代码后,执行会输入 “Hello World!
”。接下来通过以下形式,在打印“Hello World!
”前后各加一行日志:
package main
import "fmt"
func hello() {fmt.Println("before")
fmt.Println("Hello World!")
fmt.Println("after")
}
func main() {hello()
}
代码执行后输入:
`before
Hello World!
after`
当然咱们能够抉择一个更好的实现形式,即独自编写一个专门用来打印日志的 logger
函数,示例如下:
package main
import "fmt"
func logger(f func()) func() {return func() {fmt.Println("before")
f()
fmt.Println("after")
}
}
func hello() {fmt.Println("Hello World!")
}
func main() {hello := logger(hello)
hello()}
能够看到 logger
函数接管并返回了一个函数,且参数和返回值的函数签名同 hello
一样。而后咱们在原来调用 hello()
的地位进行如下批改:
`hello := logger(hello)
hello()`
这样咱们通过 logger 函数对 hello 函数的包装,更加优雅的实现了给 hello 函数减少日志的性能。执行后的打印后果仍为:
`before
Hello World!
after`
其实 logger
函数也就是咱们在 Python
中常常应用的装璜器,因为 logger 函数不仅能够用于 hello,还能够用于其余任何与 hello 函数有着同样签名的函数。
当然如果想应用 Python 中装璜器的写法,咱们能够这样做:
package main
import "fmt"
func logger(f func()) func() {return func() {fmt.Println("before")
f()
fmt.Println("after")
}
}
// 给 hello
函数打上 logger
装璜器
@logger
func hello() {fmt.Println("Hello World!")
}
func main() {
// hello 函数调用形式不变
hello()}
但很遗憾,下面的程序无奈通过编译。因为 Go 语言目前还没有像 Python 语言一样从语法层面提供对装璜器语法糖的反对。
正文完