本文目錄一覽:
- 1、golang命令行庫Cobra的使用
- 2、socket 通信粘包怎麼處理
- 3、知識分享之Golang——精選的組件庫、組件列表,各種golang組件都可找到
- 4、一起使用GO(golang) 來做一個後台管理系統系列10 使用mod 來管理包
- 5、golang udp編程
- 6、Golang常用包有哪些
golang命令行庫Cobra的使用
寫了2次才寫完,內容很長,翻譯了很久,內容來源於Cobra github介紹。翻譯完也更全面的了解了Cobra,功能相當強大完善,各種使用的場景都考慮到了。另外也擴展了一些其它知識,比如 命令行玩法 , Levenshtein distance 等等。以下是正文:
Cobra提供簡單的介面來創建強大的現代化CLI介面,比如git與go工具。Cobra同時也是一個程序, 用於創建CLI程序
Cobra是建立在結構的命令、參數和標誌之上。
命令代表操作,參數和標誌是這些行動的修飾符。
最好的應用程序就像讀取句子。用戶會知道如何使用本機應用程序,因為他們將理解如何使用它。
比如下面的例子, server 是命令, port 是標誌:
在下面的命令,我們告訴Git克隆url地址bare
使用Cobra很簡單。首先,使用 go get 安裝最新版本
然後在你項目里引用Cobra
通常基於Cobra的應用程序將遵循下面的組織結構,當然你也可以遵循自己的介面:
在Cobra應用程序中,通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。
Cobra提供自己的程序來創建你的程序並且添加你想要的命令。這是最簡單的方式把Cobra添加到你的程序里。
這裡 你能找到相關信息
使用Cobra,需要創建一個空的main.go文件和一個rootCmd文件。你可以選擇在合適的地方添加額外的命令。
Cobra不需要特殊的構造函數。簡單的就可以創建你的命令。
理想情況下你把這個放在在 app/cmd/root.go
你會另外定義標誌和處理配置init()函數。
比如 cmd/root.go
你需要在main函數里執行root命令。
通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。
其它的命令通常定義在cmd/目錄下的自己文件內
如果你想創建一個version命令,你可以創建cmd/version.go文件,並在文件里這麼寫:
標誌提供修飾符控制動作命令如何操作
當標誌定義好了,我們需要定義一個變數來關聯標誌
‘持久’表示每個在那個命令下的命令都將能分配到這個標誌。對於全局標誌,’持久’的標誌綁定在root上。
Cobra默認只在目標命令上解析標誌,父命令忽略任何局部標誌。通過打開 Command.TraverseChildren Cobra將會在執行任意目標命令前解析標誌
你同樣可以通過 viper 綁定標誌:
在這個例子中,永久的標記 author 被 viper 綁定, 注意 , 當用戶沒有給 –author 提供值, author 不會被賦值。
標記默認是可選的,如果你希望當一個標記沒有設置時,命令行報錯,你可以標記它為必須的
驗證位置參數可以通過 Command 的 Args 欄位。
內置下列驗證方法
一個設置自定義驗證的例子
在下面的例子,我們定義了3個命令。2個在頂級,一個(cmdTimes)是其中一個頂級命令的子命令。在這個例子里,由於沒有給 rootCmd 提供 Run ,單獨的root是不能運行的,必須要有子命令。
我們僅為一個命令定義了標記。
更多關於flags的文檔可以在 找到
更完整大型程序的例子, 可以查看 Hugo .
當你的程序有子命令時,Cobra 會自動給你程序添加help命令。當你運行『app help』,會調用help命令。另外,help同樣支持其它輸入命令。例如,你有一個沒有任何其它配置的命令叫『create』,當你調用『app help create』 Corbra 將會起作用。
下面的輸入是 Cobra 自動生成的。除了命令和標誌的定義,其它不再需要。
help 就跟其它命令一樣,並沒有特殊的邏輯或行為。事實上,你也可以提供你自己help如果你想的話。
你能為默認的命令,提供你自己的help命令或模板。使用下面的方法:
後2個也將適用於任何子命令
當用戶提供無效的標記或命令,Cobra 將會返回 用法 。
你可能從上面的幫助意識到,默認的幫助將被嵌入到用法里然後作為輸出。
你能提供你自己的用法函數或模板給 Cobra 使用。
比如幫助,方法和模板都可以重寫。
如果Version欄位設置到了根命令,Cobra 會提供了一個頂層 『–version』標記。運行帶上『–version』標記的程序,將會按照模板版本信息。模板可以通過 cmd.SetVersionTemplate(s string) 方法修改
在命令運行前或運行後,再運行方法非常容易。 PersistentPreRun 和 PreRun 方法將會在 Run 之前執行。 PersistentPostRun 和 PostRun 方法將會在 Run 之後執行。 Persistent*Run 方法會被子命令繼承,如果它們自己沒有定義的話。這些方法將按照下面的屬性執行:
下面的例子,2個命令都使用了上面的特性。當子命令執行的時候,它將執行根命令的 PersistentPreRun ,但不會執行根命令的 PersistentPostRun :
輸出:
Cobra 會自動輸出建議,當遇到「unknown command」錯誤時。這使得當輸入錯誤時, Cobra 的行為類似 git 命令。例如:
建議會基於註冊的子命令自動生成。使用了 Levenshtein distance 的實現。每一個註冊的命令會匹配2個距離(忽略大小寫)來提供建議。
如果你希望在你的命令里,禁用建議或虛弱字元串的距離,使用:
或
你可以通過 SuggestFor 來給命令提供明確的名詞建議。這個特性允許當字元串不相近,但是意思與你的命令相近,別切你也不想給該命令設置別名。比如:
Cobra 可以基於子命令,標記,等生成文檔。以以下格式:
Cobra 可以生成一個bash-completion文件。如果你給命令添加更多信息,這些completions可以非常強大和靈活。更多介紹在 Bash Completions 。
socket 通信粘包怎麼處理
一、socket 通信粘包的處理方法:
1、對於發送方引起的粘包現象,用戶可通過編程設置來避免,TCP提供了強制數據立即傳送的操作指令push,TCP軟體收到該操作指令後,就立即將本段數據發送出去,而不必等待發送緩衝區滿;
2、對於接收方引起的粘包,則可通過優化程序設計、精簡接收進程工作量、提高接收進程優先順序等措施,使其及時接收數據,從而盡量避免出現粘包現象;
3、由接收方控制,將一包數據按結構欄位,人為控制分多次接收,然後合併,通過這種手段來避免粘包。
二、實現代碼:
三、方法注意事項:
1、第一種編程設置方法雖然可以避免發送方引起的粘包,但它關閉了優化演算法,降低了網路發送效率,影響應用程序的性能,一般不建議使用。
2、第二種方法只能減少出現粘包的可能性,但並不能完全避免粘包,當發送頻率較高時,或由於網路突發可能使某個時間段數據包到達接收方較快,接收方還是有可能來不及接收,從而導致粘包;
3、第三種方法雖然避免了粘包,但應用程序的效率較低,對實時應用的場合不適合。
四、實驗環境
1、硬體環境:伺服器:pentium 350 微機 、客戶機:pentium 166微機、網路平台:由10兆共享式hub連接而成的區域網;
2、軟體環境:操作系統:windows 98 、編程語言:visual c++ 5.0
知識分享之Golang——精選的組件庫、組件列表,各種golang組件都可找到
知識分享之Golang篇是我在日常使用Golang時學習到的各種各樣的知識的記錄,將其整理出來以文章的形式分享給大家,來進行共同學習。歡迎大家進行持續關注。
知識分享系列目前包含Java、Golang、Linux、Docker等等。
awesome-go 這個組件包含了各種golang中常用的組件,說白了就是一個精選的 Go 框架、庫和軟體的匯總表。
我們日常需要尋找各種golang組件時在這個列表中基本都可以快速找到。
一起使用GO(golang) 來做一個後台管理系統系列10 使用mod 來管理包
原項目採用gopath來管理的引用庫,但有小夥伴反應說包不好下,雖然我把對應的包做了百度雲盤共享,但小夥伴們仍然感覺不太好用。特別是最近把go SDK升級到1.18.在管理包上終於下決心使用mod來重新重構下包管理。
一、配置啟用Mod
首先那:
確定是否開啟了
如果沒有開啟請開啟它。開啟命令執行:
#設置 使用七牛雲下載
來看下現在的配置:
二、創建項目
上邊都說了如何開啟了。下面介紹下如何使用
1. 可以隨便找一個目錄創建項目:myGoProjectNew
這個時候查看目錄下會多出一個go.mod的文件:
裡面也有了。標識了下SDK的版本1.18
2. 創建 main.go文件
3. 執行:
這時候就會自動下載引用了。
查看Go.mod文件
最後放兩張效果圖:
感覺還可以得點贊收藏哦。想要源碼的私信我獲取源碼。
golang udp編程
用戶數據報協議(User Datagram Protocol,縮寫為UDP),又稱用戶數據報文協議,是一個簡單的面向數據報(package-oriented)的傳輸層協議,正式規範為RFC 768。
UDP只提供數據的不可靠傳遞,它一旦把應用程序發給網路層的數據發送出去,就不保留數據備份(所以UDP有時候也被認為是不可靠的數據報協議)。
UDP在IP數據報的頭部僅僅加入了復用和數據校驗。
由於缺乏可靠性且屬於非連接導向協議,UDP應用一般必須允許一定量的丟包、出錯和複製粘貼。
1 在接收udp包時,如果接收包時給定的buffer太小的話,就要自己解決粘包問題。
2 udp包的發送和接收不保證一定成功,不保證按正確順序抵達。
3 如果不允許丟包的情況出現的話,要有重發機制來保證,如:反饋機制確認。
服務端
客戶端
Golang常用包有哪些
⑴ Go Kit
它本身不是一個框架,而是一套微服務工具集,可以用於解決分散式系統開發中的大多數常見問題,所以使用者可以專註於你的業務邏輯中。
⑵ Gingko
是一個Go測試框架,目的是幫助我們使用行為驅動開發風格高效地編寫富有表現力和全面的測試,它有著非常良好的幫助文檔,任何人都可以輕鬆地在項目中集成使用它。
⑶ NSQ
實時分散式消息傳遞平台,提供高可用性和可靠的消息傳遞保證,可以水平擴展,支持負載均衡,安裝部署非常方便。
⑷ Goose
Golang中最佳的資料庫遷移包,通過創建增量SQL更改和Go函數來管理資料庫結構,在Go1.16版本以上,還支持了嵌入式sql遷移。
⑸ GORM
是一個功能齊全的Golang對象關係映射庫,是一種開發人員友好的工具,用於在不兼容的類型系統之間轉換數據,專門設計用於在類型系統之間切換時最大限度地減少重寫代碼。
⑹ Authboss
一個模塊化的身份驗證包,使用它你可以快速地在項目中進行身份驗證管理。它有幾個常見的身份驗證和授權模塊供開發人員選擇。
⑺ cli
是一個簡單快捷的命令行管理包,用於為Go語言構建命令行應用程序,允許開發人員開發自己的富有表現力的命令行應用程序,用於創建標誌、bash完成常式並生成幫助文本。
⑻ Vegeta
是一個用於HTTP負載測試的工具包,這個多功能工具專為測試具有恆定請求率的HTTP服務而設計。它可以有效地分析程序中的潛在問題,是一個始終貫穿以提高整體性能為目的的包。
原創文章,作者:GSVN,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/141382.html