歡迎!這個系列的博文會帶你使用golang語言來編寫一個你自己的文字編輯器。
首先想說說寫這個系列文章的動機。
其實作為校招生加入某頭部網際網路大廠一轉眼已經快4年了。可以說該大廠算是比較早的用golang語言作為主要後端開發技術棧的公司了,絕大部分後端專案的語言選型都是golang。最近一年會發現許多核心的專案都在嘗試使用rust語言來重寫。歸因無非是經過長期的迭代、最佳化,golang的效能已經被充分榨乾了,在降本增效的大環境下,需要一些突破性的技術在硬體資源不變的情況下進一步提高服務的效能(或在當前服務效能保持不變的情況下儘可能減少硬體資源的消耗),所以rust自然進入了大家的視野。公司內大佬們也各顯神通,對服務進行rust重構,最終也拿到了不俗的收益。
筆者自然也對rust產生了濃厚的興趣,饒有興致的學了一番,搞明白了它的各個特性之後就想著去實踐一下,檢驗自己的學習成果。於是找到了這個基於rust的文字編輯器專案,跟著文章一步步手寫了下來,收穫頗豐,對rust理解也更深入了。
有點歪題了言歸正傳,拿rust寫完之後意猶未盡,恰逢由於一些業務調整打算轉崗,在敲定接收部門並開始走活水流程之後,得到了難得的幾周喘息時間,於是想著趁著這個時間用golang語言再把文字編輯器給從零開始實現一遍。最後花了三天時間,借鑑了上文專案的一些思路,寫出了個簡易版的文字編輯器(展示、編輯、儲存功能)。其實這類小工程小專案還是比較適合拿來熟悉一門程式語言的,所以決定把如何從零構建一個小型娛樂向的編輯器給記錄一下分享出來,供大家參考學習。當然對那些已經瞭解golang,但對文字編輯器實現的來龍去脈感到疑惑的讀者,這個系列文章也適合你。
總結一下,這個系列的帖子將引導你透過多個小作業的形式來構建編輯器並深入理解golang語言。這裡假定你對golang的語法已經有一定的瞭解。在大多數步驟中,你都可以透過編譯和執行程式來觀察所做的更改。在我看來,僅僅是輸入程式碼並觀察執行結果,就可以學到很多東西。我會以commit的方式給出每一個小作業的程式碼示例(不一定是最優寫法)供大家參考,當然非常鼓勵先自己嘗試完成然後和我的作對比。最終的實現效果如上圖所示。目前它只支援基本的展示、編輯、儲存功能,之後如果有時間會增加更多功能,如搜尋、高亮等能力。
這個專案的原始碼我已經放在我的github上,取名為zedterm。每一章都有對應的branch,每一個作業都有對應commit。當前僅更新到了文字檢視功能,預期8月中旬搞定編輯、儲存功能。這樣一個基本的文字編輯器就已初具雛形了。