有過(guò)其它編程語(yǔ)言的基礎(chǔ)的話,我們就知道裝飾器其實(shí)就是ASP.NET Core
里面的管道(Pipeline
),C# 里面的AOP
。
下面,我們就是用Go
的裝飾器模式來(lái)實(shí)現(xiàn)一個(gè)函數(shù)運(yùn)行時(shí)的計(jì)時(shí)器。
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)
}
輸出的結(jié)果為:
Before computing...
The result is :500
The total time is 5.322μs
After computing...
我們用handleFunc
對(duì)其中的調(diào)用再次進(jìn)行一次包裝,方便調(diào)用。
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))
這種調(diào)用的方式,是不是想起了http.HandleFunc("/", IndexHandler)
這種的調(diào)用方式呢?