golang出庫處理,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 。

Golang 遊戲leaf系列(六) Go模塊

在 Golang 遊戲leaf系列(一) 概述與示例 (下文簡稱系列一)中,提到過Go模塊用於創建能夠被 Leaf 管理的 goroutine。Go模塊是對golang中go提供一些額外功能。Go提供回調功能,LinearContext提供順序調用功能。善用 goroutine 能夠充分利用多核資源,Leaf 提供的 Go 機制解決了原生 goroutine 存在的一些問題:

我們來看一個例子(可以在 LeafServer 的模塊的 OnInit 方法中測試):

這裡的 Go 方法接收 2 個函數作為參數,第一個函數會被放置在一個新創建的 goroutine 中執行,在其執行完成之後,第二個函數會在當前 goroutine 中被執行。由此,我們可以看到變量 res 同一時刻總是只被一個 goroutine 訪問,這就避免了同步機制的使用。Go 的設計使得 CPU 得到充分利用,避免操作阻塞當前 goroutine,同時又無需為共享資源同步而憂心。

這裡主動調用了 d.Cb(-d.ChanCb) ,把這個回調取出來了。實際上,在skeleton.Run里會自己取這個通道

看一下源碼:

New方法,會生成指定緩衝長度的ChanCb。然後調用Go方法就是先執行第一個func,然後把第二個放到Cb里。現在手動造一個例子:

這裡解釋一下,d.Go根據源碼來看,實際也是調用了一個協程。然後上面兩次d.Go並不能保證先後順序。目前的輸出結果是1+2那個先執行了,把3寫入d.ChanCb,然後把3讀出來,繼續讀時,d.ChanCb里沒有東西,阻塞了。然後1+1那個協程啟動了,最後又讀到了2。

現在把time.Sleep(time.Second)的注釋解開,會是啥結果呢

這裡執行到time.Sleep睡著了,上面兩個d.Go仍然是不確定順序的,但是會各自的function先執行掉,然後陸續把cb寫入d.ChanCb。看這次輸出,1+2先寫進去的。所以最後執行d.Cb時,就把3先讀出來了。然後d.ChanCb的長度為1,說明還有一個,就是輸出2了。

另外,就是close時會判斷g.pendingGo

這個例子的意思很明顯,NewLinearContext這種方式,即使先調用的慢了半秒,它還是會先執行完。

這裡先是用了一個list,加入的時候用mutexLinearGo鎖了,都加到最後。然後新開協程去處理,讀的時候從最前面開始讀,也要用mutexLinearGo鎖。執行的時候,也要上鎖mutexExecution,確保f()執行完並且寫入g.ChanCb回調,這個mutexExecution鎖才會解除。現在可以改造一個帶回調的例子:

結果說明,確實是2先被寫入了d.ChanCb。

golang實現簡單的流式處理

實現一個最簡單的類似spark的流式處理流程

包含map和filter

數據

map函數

fliter函數

所有數據+1 過濾出偶數 過濾出大於5的數

原創文章,作者:WQFZ,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/144922.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
WQFZ的頭像WQFZ
上一篇 2024-10-26 11:53
下一篇 2024-10-26 11:53

相關推薦

  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • 使用Golang調用Python

    在現代軟件開發中,多種編程語言的協作是相當普遍的。其中一種使用場景是Golang調用Python,這使得在使用Python庫的同時,可以利用Golang的高性能和強大並發能力。這篇…

    編程 2025-04-29
  • 使用Golang創建黑色背景圖片的方法

    本文將從多個方面介紹使用Golang創建黑色背景圖片的方法。 一、安裝必要的代碼庫和工具 在開始創建黑色背景圖片之前,我們需要先安裝必要的代碼庫和工具: go get -u git…

    編程 2025-04-29
  • Python序列的常用操作

    Python序列是程序中的重要工具,在數據分析、機器學習、圖像處理等很多領域都有廣泛的應用。Python序列分為三種:列表(list)、元組(tuple)和字符串(string)。…

    編程 2025-04-28
  • 上傳多媒體文件的常用方法——uploadmediabyurl

    uploadmediabyurl是一個非常常用的方法,它允許我們將本地的多媒體文件上傳到微信服務器上。 一、uploadmediabyurl的基本使用方法 要使用uploadmed…

    編程 2025-04-27
  • Python數據看板開發:常用的包及其使用

    隨着數據分析和可視化的需求日漸增長,數據看板作為一種高效展示複雜數據信息的工具應運而生。Python語言作為一種面向數據分析和科學計算的編程語言,在數據看板開發中有着廣泛的應用。本…

    編程 2025-04-27
  • Python常用庫

    Python是一種高級編程語言,擁有豐富的第三方包和工具,常用庫涵蓋了各種應用場景。在此,我們將從以下幾個方面對Python常用庫進行闡述: 一、數據分析 數據分析是Python的…

    編程 2025-04-27
  • Python在運維中的常用庫

    Python被廣泛應用於各種Web應用程序、數據分析、自動運維、AI應用等領域。在運維領域,Python成為了最常用的編程語言之一。在本文中,我們將會討論Python運維中常用的庫…

    編程 2025-04-27
  • Python常用斷言函數用法介紹

    本文將詳細介紹Python中常用的斷言函數,讓大家了解這些函數的作用及使用方法,以便於進行代碼測試和調試。 一、assertEqual函數 1、assertEqual函數是Pyth…

    編程 2025-04-27
  • Python常用函數用法介紹

    Python是一種高級編程語言,擁有強大且易於使用的函數庫,可以輕鬆實現各種任務。本文將詳細介紹Python中常用的函數,包括字符串、數字、列表、字典、日期等方面的常見函數。 一、…

    編程 2025-04-27

發表回復

登錄後才能評論