左耳聽風_114_113_Go編程模式修飾器

你好,我是陳浩,我名多爾多house.之前呢我寫過一篇文章叫做python修飾器的函數式編程。

那這種模式呢可以很輕松的把一些函數啊裝配到另外一些函數上。

讓你的代碼呢更加簡單,也可以讓一些小功能性的代碼復用性更高。

讓代碼中的函數呢可以像樂高玩具那樣自由的拼裝。

所以說一直以來呢我都對修飾器這種編程模式啊情有獨鐘。

那這節課呢我們就來聊一聊構元里面的修飾器編程模式。

那如果你看過我剛說的文章呢,就一定知道這是一種函數式編程的玩法,也就是用一個高級函數來包裝一下。

那多嘮叨一句,關于函數式編程呢,我之前還寫過一篇文章,叫做函數式編程。

參考資料:https://51gx.top/detail/265那這篇文章呢主要是想通過詳細介紹從過程式編程的思維方式,過渡到函數式編程的思維方式,從而帶動更多的人玩函數式編程。

所以說如果你想了解一下函數式編程啊,那么呢你可以點擊文稿里的鏈接啊,閱讀一下這篇文章。

其實啊構語言的修飾其編程模式,也是函數式編程的模式。

不過呢要提醒你注意的是,構元的糖不多,而且呢又是強烈性的靜態無虛擬機的語言。

所以說啊你沒有辦法做到像java和python那樣寫出優雅的修飾器的代碼。

當然也許是我財出學淺。

那如果你知道更多的寫法呢,請你一定要告訴我。

在文稿里呢有一個簡單的事例,我們動用了一個高階函數decorator.在調用的時候呢,先把hello函數傳進去,然后呢它會返回一個匿名函數。

那這個匿名函數中啊,除了運行了自己的代碼,它也調用了被傳入的hello函數。

那這個玩法呢和python很像,只不過有點遺憾。

Go呢并不支持像python那樣的decorator與法堂,所以說在調用上有點難看。

當然如果你想讓代碼更容易讀啊,可以用文章里展示的寫法。

文章里呢還有一個計算運行時間的例子。

那關于這段代碼呢,有幾點,我要說明一下。

第一,這里呢有兩個sum函數,sum一函數呢就是簡單的做個循環,而sum二函數呢動用了數據公式。

第二,在代碼中呢使用了構物元的反射機制來獲取函數名。

第三,修飾器函數呢是time to some funk.那接下來呢我再給你講一個處理HTTP請求的相關例子。

我們先看文章里這段簡單的HTTP server的代碼。

在這段代碼中呢使用到了修飾器模式。

With server header函數呢就是一個decorator,它會傳入一個HTP handle funk,然后呢返回一個改寫的版本兒。

但這個例子呢還是比較簡單的,用with server header呢就可以加入一個response header.所以說這樣的函數呢,我們可以寫出好多有寫HTP響應頭的,有寫認證cookie的,有檢查認證cookie的,有打日志的等等。

下面呢我們再說一說多個修飾器的pipeline,前面講的go修飾器啊,在使用上需要對函數一層一層的套起來,呃,看上去呢好像不是很好看。

那如果需要的修飾器比較多的話呢,代碼就會比較難看了。

不過呢我們可以重構一下,在重構的時候呢,我們需要先寫一個工具函數,用來便利并調用各個修飾器。

然后呢我們就可以像文章里這樣使用了,那這樣的代碼也更加容易讀了,一些pipeline的功能呢也出來了。

不過呢對于go的修飾器模式啊,還有一個小問題,就是好像無法做到泛型。

比如說剛剛那個計算時間的函數,它的代碼呢耦合了,需要被修飾函數的接口類型,無法做到非常的通用。

那如果這個問題解決不了,那么這個休日器模式還是有點不好用的。

Go語言它不像python和java, python呢是動態語言,而java有語言虛擬機,所以它們呢可以實現一些比較變態的事兒。

但是呢go語言是一個靜態的語言,這就意味著類型需要在編譯的時候就搞定,不然的話就無法編譯。

不過呢購物員支持的最大的泛型是interface,還有比較簡單的reflection機制。

在這上面做一做文章呢,應該還是可以搞定的。

我在文稿里啊分享了我用reflection機制寫的一個比較通用的修飾器。

這段代碼呢動用了reflect點make fun函數,它創造了一個新的函數。

那其中呢他給的fun點call呢,調用了被修飾的函數。

那關于構元的反射機制啊,你可以閱讀一下官方文章。

The loss of reflection.那這里呢我就不多說了。

那這個decorator呢需要兩個參數,一個是出參deco pointer啊,就是完成修飾后的函數。

另一個呢是入參function,就是需要修飾的函數。

那這樣寫是不是有點傻呢?的確是,不過呢這是我個人在購物員里面所能寫出來的最好的代碼了。

那如果你知道更多優雅的寫法,請你一定要告訴我好了,那具體的使用效果是怎么樣的呢?首先假設我們有兩個需要修飾的函數負五和bar.然后呢,我們可以像文章里這樣聲明,一個買負函數,然后呢用decorator修飾它。

你會發現使用decorator的時候呢,還需要先聲明一個函數簽名,感覺好傻一點都不犯醒,不是嗎?那如果你不想聲明函數簽名呢,還可以用另一種方式,就是通過賦值啊,讓麥把兒推斷出把兒的類型,可能看上去不是那么漂亮。

但是it works啊,聽到這兒咱們就可以知道了。

構員目前本身的特性啊,無法做成像java或者python那樣。

那對此呢我們只能期待購魚啊,多放一些糖了。

最后呢我再強調一下,如果你有更好的寫法,請你一定要告訴我好了。

這節課呢就到這里。

如果你覺得今天的內容對你所幫助啊,歡迎你幫我分享給更多人。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40397.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40397.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40397.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

掌握XD數字設計:打造令人驚艷的用戶體驗

xd是adobe旗下一款主打UI界面設計-建立原型的軟件,它可以將wireframe、design、以及prototype等UI/UX設計流程整合到一個軟件中,算是一款與sketch對打的軟件。 與PS相比,在UI設計方面,Adobe XD有非常突出的3個優點:能…

從0到1手寫vue源碼

模版引擎 數組join法(字符串) es6反引號法(模版字符串換行) mustache (小胡子) 引入mustache 模版引擎的使用 mustache.render(templatestr,data) mustache.render 循環簡單數組 循環復雜數組 循環單項數組 數組的嵌套 musta…

江蘇徐州SAP代理商有哪些?怎么選擇?

在數字化浪潮席卷全球的今天,企業對于高效、智能的管理系統需求日益迫切。SAP作為全球領先的企業管理軟件解決方案提供商,其產品在市場上享有極高的聲譽。而在江蘇徐州,哲訊智能科技作為SAP的代理商,以其專業的技術實力和優質的服…

開源205W桌面充電器,140W+65W升降壓PD3.1快充模塊(2C+1A口),IP6557+IP6538

開源一個基于IP6557和IP6538芯片的205W升降壓快充模塊(140W65W),其中一路C口支持PD3.1協議,最高輸出28V5A,另一路是A口C口,最高輸出65W(20V3.25A),可搭配一個24V10A的開關…

代碼隨想錄算法訓練營第3天|LeetCode

203.移除鏈表元素 題目鏈接:203. 移除鏈表元素 - 力扣(LeetCode) 文檔鏈接:代碼隨想錄 (programmercarl.com) 視頻鏈接:手把手帶你學會操作鏈表 | LeetCode:203.移除鏈表元素_嗶哩嗶哩_bilibili 第一想法 …

SpringBoot-第一天學習

SpringBoot介紹-約定大于配置 SpringBoot是在Spring4.0基礎上開發的,不是替代Spring的解決方案,而是和Spring框架結合并進一步簡化Spring搭建和開發過程的。 如何簡化?就是通過提供默認配置等方式讓我們更容易,集成了大量常用的…

交叉測試的優點和缺點!

交叉測試在軟件測試中具有重要的地位和作用。通過交叉測試,可以提高軟件質量、提升用戶體驗、增加測試覆蓋率、提高測試效率以及滿足市場需求和競爭優勢。因此,在軟件開發和測試過程中,應充分重視交叉測試的實施和應用。 以下是對其優缺點的…

推薦3款Windows系統的神級軟件,免費、輕量、絕對好用!

DiskView DiskView是一款用于管理和查看磁盤空間的工具,它集成了于微軟的Windows操作系統資源管理器中,以顯示直觀的磁盤空間使用情況。該軟件通過生成圖形化地圖,幫助用戶組織和管理大量文件和文件夾,從而高效地管理磁盤空間。用…

JDBC 學習筆記+代碼整理

Tip Idea自帶可視界面👉MySQL 圖形化界面-CSDN博客 Idea2022無add Framework support選項👉最新版IDEA:Add web Framework Support步驟/構建JavaWeb項目步驟_idea add framework support-CSDN博客 基本步驟 1.加載驅動包Driver 2.建立與數據庫的連接C…

證券交易系統中服務器監控系統功能設計

1.背景介紹 此服務器監控系統的目的在于提高行情服務器的監管效率,因目前的的行情服務器,包括DM、DT、DS配置數量較多,巡回維護耗時較多,當行情服務器出現異常故障,或者因為網絡問題造成數據斷線等情況時,監…

芯科普| 矽光子是什麼?可以用在哪些領域?點擊查看!

隨著生成式人工智能的崛起,數據傳輸需求亦呈現爆發式增長。而在此背景下,臺積電在半導體展覽上披露的硅光子(SiPh:Silicon Photonics)技術進展,更是將硅光子推向了風口浪尖,成為了市場的寵兒。 …

IDEA導入依賴+Maven配置

Maven安裝及配置 安裝 安裝鏈接:https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/ 注:建議不要直接安裝最新版本,選用常用、穩定的版本安裝即可,比如:3.6.3 配置 1> 配置bash_profile文件 終端輸…

《知識點掃盲 · 監聽器 Listener》

📢 大家好,我是 【戰神劉玉棟】,有10多年的研發經驗,致力于前后端技術棧的知識沉淀和傳播。 💗 🌻 CSDN入駐不久,希望大家多多支持,后續會繼續提升文章質量,絕不濫竽充數…

高效前端開發:解密pnpm的存儲與鏈接

什么是pnpm PNPM(Performant NPM)是一種快速且節省磁盤空間的包管理工具。相較于其他包管理器如NPM和Yarn,PNPM通過獨特的存儲機制和鏈接技術解決了許多常見的問題。以下是PNPM如何避免這些問題以及其關鍵技術的詳細介紹。 特性 PNPM Store…

批量注冊工具是什么

摘要:批量注冊工具作為自動化領域的一個分支,為用戶在多平臺賬號管理中提供了極大的便利。 關鍵詞 批量注冊,自動化,實戰代碼,設計原則,法律法規 1. 引言 批量注冊工具能夠在短時間內創建大量賬號&…

【MySQL備份】Percona XtraBackup總結篇

目錄 1.前言 2.問題總結 2.1.為什么在恢復備份前需要準備備份 2.1.1. 保證數據一致性 2.1.2. 完成崩潰恢復過程 2.1.3. 解決非鎖定備份的特殊需求 2.1.4. 支持增量和差異備份 2.1.5. 優化恢復性能 2.2.Percona XtraBackup的工作原理 3.注意事項 1.前言 在歷經了詳盡…

數據庫、創建表、修改表

一、數據庫 1、登陸數據庫 2、創建數據庫zoo 3、修改數據庫zoo字符集為gbk 4、選擇當前數據庫為zoo 5、查看創建數據庫zoo信息 6、刪除數據庫zoo 二、創建表 1、創建一個名稱為db_system的數據庫 2、在該數據庫下創建兩張表,具體要求如下 員工表 user…

圖像的對數變換

對數變換在圖像處理中通常有以下作用: 因為對數曲線在像素值較低的區域斜率較大,像素值較高的區域斜率比較低,所以圖像經過對數變換之后,在較暗的區域對比度將得到提升,因而能增強圖像暗部的細節。圖像的傅里葉頻譜其…

MySQL 結構的優化方案

主要是指三方面,即表結構、字段結構以及索引結構,這些結構如果不合理,在某些場景下也會影響數據庫的性能,因此優化時也可以從結構層面出發。一般在項目的庫表設計之初就要考慮,當性能瓶頸出現時再調整結構,…

Python函數語法詳解(與C++對比學習)【未完】

一、Python函數的形式 def function_name (參數, ...) -> return value_type:# 函數體return value# 看具體需求# 如果沒有return語句,函數執行完畢后也會返回結果# 只是結果為None。return None可以簡寫為return 1. Python的返回值 在Python3中,提…