Golang 装饰器函数模式

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程