fmt列印不顯示 go Go 裝飾器模式教程

2021-10-14 09:04:26 字數 3765 閱讀 9038

裝飾器在其他程式語言(如 python 和 typescript)中肯定更為突出,但這並不是說你不能在 go 中使用它們。事實上,對於某些問題,使用裝飾器是完美的解決方案,通過本教程中我們可以了解到裝飾器的用法。

裝飾器本質上允許您包裝現有功能並在開始或結尾處新增您自己的自定義功能。
在 go 中,函式被視為第一等物件,這實際上意味著您可以像傳遞變數一樣傳遞它們。我們來看乙個非常簡單的例子:

package main

import (

"fmt"

"time"

)func myfunc()

func main()

在這個例子中,我們定義了乙個名為myfunc的函式,它只是列印出hello world。在我們main()函式的主體中,我們已經呼叫了fmt.printf並使用%t列印出作為第二個引數傳遞的值的型別。在示例種,我們傳入引數myfunc,這將列印出以下內容:

$ go run test.go

type: func()

那麼,這對我們來說意味著什麼呢?好吧,它突出了這樣乙個事實,即函式可以在我們的**庫的其他部分中傳遞並用作引數

讓我們通過擴充套件我們的**庫並新增乙個coolfunc()函式來認識這一點,該函式將函式作為其唯一引數:

package main

import (

"fmt"

"time"

)func myfunc()

// coolfunc takes in a function

// as a parameter

func coolfunc(a func())

func main()

當我們執行它時,可以看到新輸出具有我們期望的字串hello world

$ go run test.go

type: func()

hello world

現在,這可能會讓你有點奇怪。為什麼要做這樣的事情?它本質上為呼叫myfunc新增了一層抽象,這使**複雜化而不會真正增加很多價值。

讓我們看看如何使用這種模式為我們的**庫新增一些價值。如果需要,我們可以在執行特定函式時新增一些額外的日誌記錄,以顯示它的開始和結束時間。

package main

import (

"fmt"

"time"

)func myfunc()

func coolfunc(a func())

func main()

在呼叫它時,您應該看到像這樣的日誌:

$ go run test.go

type: func()

starting function execution: 2018-10-21 11:11:25.011873 +0100 bst m=+0.000443306

hello world

end of function execution: 2018-10-21 11:11:26.015176 +0100 bst m=+1.003743698

如您所見,我們已經能夠有效地包裝我的原始函式,而無需改變它的實現。我們現在能夠清楚地看到此函式何時啟動以及何時完成執行,並向我們強調該函式只需要大約一秒鐘即可完成執行。

讓我們看一些如何使用裝飾器進一步獲取價值的例子。我們將實現乙個非常簡單的http web伺服器並裝飾我們的端點,以便我們可以驗證傳入請求是否具有特定的請求頭。

如您所見,我們的**中沒有特別複雜的東西。我們設定了乙個服務於單個/端點的net/http服務。

讓我們新增乙個非常簡單的身份驗證裝飾器函式,它將檢查authorized請求頭是否設定為true

注意:這絕對不是處理 rest api 保護的正確方法,我建議您使用 jwt 或 oauth2 來實現這一目標!
所以,讓我們打破這一點,試著了解發生了什麼!

我們建立了乙個新的裝飾器函式isauthorized(),該函式接受乙個與原始homepage函式匹配相同簽名的函式。然後返回乙個http.handler

isauthorized()函式體內,我們返回乙個新的http.handlerfunc並在其中驗證authorized請求頭是否等於true。這是乙個大大簡化的oauth2身份驗證 / 授權版本,雖然存在一些細微的差異,但它可以讓您大致了解它的工作方式。

然而,需要注意的關鍵是,我們已經設法裝飾現有端點並在所述端點周圍新增某種形式的身份驗證,而無需更改該功能的現有實現。

現在,如果我們要新增乙個我們想要保護的新端點,我們可以輕鬆地這樣做:

這突出了裝飾器模式的主要優點,在我們的**庫中包裝**非常簡單。我們可以使用相同的方法輕鬆新增新的經過身份驗證的端點

希望這個教程有助於揭開裝飾者的實現,以及如何在自己的 go 程式中使用裝飾器模式。我們了解了裝飾器模式的好處以及我們如何使用它來用新功能包裝現有功能。

在本教程的第二部分中,我們檢視了乙個更實際的示例,了解如何在您自己的生產級 go 系統中使用它。

@elliot_f

fmt列印不顯示 go Go語言輸出列印 排坑

一.幾種公共方法 1 print 輸出到控制台 不接受任何格式化,它等價於對每乙個運算元都應用 v print 在golang中 是屬於輸出到標準錯誤流中並列印,官方不建議寫程式時候用它。可以再debug時候用 fmt.print str 2 println 輸出到控制台並換行 fmt.printl...

textArea列印時,內容不顯示

使用jqprint來列印form表單中的內容時。會出現input textarea標籤裡的東西無法列印。jquery列印原理 jqprint列印方式是把列印區域的html內容處理到新的iframe中,然後列印。這樣的乙個機制下,input textarea當中的內容如果是通過jquery賦值 手動輸...

網頁列印 條碼不顯示 條碼基本知識

下面介紹條碼格式。空白區 邊緣 條碼符號的左 右端。如果邊緣寬度不夠,條碼讀取器就無法對條碼資料進行掃瞄。注意點如果空白區寬度不夠,條碼讀取器就不能可靠地掃瞄條碼資料。起始 終止符 表明資料開始和結束的字元。條碼的種類不同,起始 終止符也不一樣。code 39採用 codabar採用 a b c 和...