有过其它编程语言的基础的话,我们就知道装饰器其实就是ASP.NET Core
里面的管道(Pipeline
),C# 里面的AOP
。
下面,我们就是用Go
的装饰器模式来实现一个函数运行时的计时器。
package main
import (
"fmt"
"time"
)
type handler func(int, int)
func wrapFunc(h handler) handler {
return func(a, b int) {
fmt.Println("Before computing...")
start := time.Now()
h(a, b)
fmt.Println("The total time is ", time.Since(start))
fmt.Println("After computing...")
}
}
func Sum(a, b int) {
fmt.Printf("The result is :%v\n", a+b)
}
func main() {
foo := wrapFunc(Sum)
foo(200, 300)
}
输出的结果为:
Before computing...
The result is :500
The total time is 5.322µs
After computing...
我们用handleFunc
对其中的调用再次进行一次包装,方便调用。
package main
import (
"fmt"
"time"
)
type handler func(int, int)
func wrapFunc(h handler) handler {
return func(a, b int) {
fmt.Println("Before computing...")
start := time.Now()
h(a, b)
fmt.Println("The total time is ", time.Since(start))
fmt.Println("After computing...")
}
}
func handleFunc(a int, b int, h handler) {
h(a, b)
}
func Sum(a, b int) {
fmt.Printf("The result is :%v\n", a+b)
}
func main() {
handleFunc(100, 200, wrapFunc(Sum))
}
看到handleFunc(100, 200, wrapFunc(Sum))
这种调用的方式,是不是想起了http.HandleFunc("/", IndexHandler)
这种的调用方式呢?