Golang 装饰器函数模式
装饰函数模式是一种主要存在于Python和JavaScript中的模式,但我们也可以在Golang中使用它。
在这种模式下,我们可以通过包装当前的函数来增加我们自己的功能。由于函数在Golang中被认为是第一类对象,这意味着我们可以像变量一样将其作为参数传递。
例子1
让我们从一个非常简单的例子开始,了解将一个函数作为参数传递给一个已经存在的函数的基本情况。
请看下面的代码。
package main
import (
"fmt"
"time"
)
func printFunc() {
fmt.Println("TutorialsPoint")
time.Sleep(time.Second)
}
func main() {
fmt.Printf("Data Type: %T\n", printFunc)
}
输出
如果我们在上述代码上运行命令 go run main.go ,我们将在终端得到以下输出。
Data Type: func()
例子2
上面的例子显示了我们随后可以将函数作为参数传递的情况,现在我们来看看一个简单的装饰器模式的函数。
考虑下图所示的代码。
package main
import (
"fmt"
"time"
)
func printFunc() {
fmt.Println("TutorialsPoint")
time.Sleep(1 * time.Second)
}
func coolFunc(sample func()) {
fmt.Printf("Beginning: %s\n", time.Now())
sample()
fmt.Printf("Ending: %s\n", time.Now())
}
func main() {
fmt.Printf("Data Type: %T\n", printFunc)
coolFunc(printFunc)
}
在上面的代码中,我们有一个简单的装饰器模式,我们将一个名为 printFunc() 的函数作为参数传递给名为 coolFunc() 的函数,该函数被调用时将自动调用 printFunc() ,从而形成装饰器模式。
上面的例子显示了如何有效地包装原始函数而不需要改变其实现。
输出
如果我们在上述代码上运行命令 go run main.go ,我们将在终端获得以下输出。
Data Type: func()
Beginning: 2021-11-01 06:59:13.490709501 +0000 UTC
TutorialsPoint
Ending: 2021-11-01 06:59:14.490865087 +0000 UTC