這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
這一周擼了個懶人通訊協議代碼產生器fastbin,這個工具會分析指定的Go代碼,提取結構體資訊,然後為每個結構體產生二進位序列化和還原序列化的方法。產生出來的代碼符合encoding包中定義的BinaryMarshaler和BinaryUnmarshaler介面要求,此外還支援更高效的序列化和還原序列化方式。
fastbin使用的序列化格式並沒有任何特別之處,沒有Protobuf的可選欄位也沒有Flatbuffer的隨機訪問功能,簡單到可以說是簡陋。
之所以開發這個工具完全是從項目開發流程的角度出發。
在我們過往的項目中,一直用一套自訂的協議描述語言做協議描述,然後用這些協議描述文檔來產生對應的服務端和客戶度代碼,這也是Protobuf、Flatbuffer等工具的流程。
這種基於配置的開發流程有個問題,在開發的時候經常需要在設定檔、命令列、產生物、功能代碼之間來回切換,這樣的切換很容易打斷思維的連貫性。
關于思維連貫性,我有個親身經曆的笑話。
有一次我要啟用個軟體,SN在我Gmail郵箱裡,我開啟Gmail郵箱時發現公司的自動科學上網打不開Gmail,於是我就開始研究公司的科學上網哪個環節出問題,最後定為到是dnsmasq的配置問題,我就去整配置。等我都配置好,開啟Gmail了,我對著電腦在那裡想了好久我剛才是要幹什麼來著?
其實這樣的事情也會發生在開發過程中,我們項目開發過程中會涉及到各種工具各種配置,這些事情每一樣都分散我們一點精力,其實無形之中給我們帶來的很多額外的精力損耗。這種精力損耗不但影響開發效率甚至也影響到產品品質和做事的積極性,因為人的精力是有限的,當一個事情做起來步驟很多很繁瑣的時候,人自然而然的就會減少做的次數,甚至從潛意識上排斥去做它。
所以我希望我們的項目開發過程中,工具可以是在手邊的,拿來就用,用完放下,不干擾,不分散精力。這樣大家可以更專註於項目本身,而不是開發流程中的某個環節。
我思索下來,覺得要做到這一點,最直接的方式就是用代碼自身作為配置,工具反過來從代碼裡提取資訊,這樣整個開發流程中就不再需要來回切換了。
所以fastbin的特性就是零配置,fastbin的fast並不是指它的執行效率有多快資料結構有多優秀,而是指它的開發效率高,按需求寫代碼就可以用了。
Go因為內建了Go的Parser,所以解析Go結構體並不難,此外Go內建的Template包也給代碼產生工具省了很多代碼,提高了代碼可讀性。
fastbin還用了Go的generate命令,只要在需要產生代碼的檔案頭加一行注釋,就可以用"go generate"命令產生這個檔案的fastbin代碼。
如果你對這個工具或者思路感興趣,歡迎到項目首頁看看,歡迎提交Issue和PR。
項目首頁:funny/fastbin · GitHub
上善若水,水善利萬物而不爭。