Go 語言中的裝飾器函式模式
裝飾器函式模式是一種主要在 Python 和 JavaScript 中發現的模式,但我們也可以在 Go 語言中使用它。
它是一種模式,我們可以透過包裝來在當前函式上新增我們自己的功能。由於 Go 語言中的函式被認為是一等公民,這意味著我們可以像處理變數一樣將它們作為引數傳遞。
示例 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
廣告