阅读 217

Golang 中的装饰器函数模式

装饰器函数模式是一种主要存在于 Python 和 JavaScript 中的模式,但我们也可以在 Golang 中使用它。

在这种模式中,我们可以通过包装当前函数来添加我们自己的功能。由于 Golang 中的函数被认为是一等对象,这反过来意味着我们可以将它们作为参数传递,就像在变量的情况下一样。

示例 1

让我们从一个非常简单的示例开始,以了解将函数作为参数传递给现有函数的基本情况。

考虑下面显示的代码。


package mainimport (
   "fmt"   "time")func printFunc() {
   fmt.Println("nhooo")
   time.Sleep(time.Second)
}func main() {
   fmt.Printf("Data Type: %T\n", printFunc)
}

输出结果


如果我们在上面的代码上运行go run main.go命令,我们将在终端中得到以下输出。


Data Type: func()


示例 2

上面的例子展示了我们随后可以将函数作为参数传递的情况,现在让我们看看一个简单的装饰器模式函数。

考虑下面显示的代码。


package mainimport (
   "fmt"   "time")func printFunc() {
   fmt.Println("nhooo")
   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 UTCnhoooEnding: 2021-11-01 06:59:14.490865087 +0000 UTC


文章分类
百科问答
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐