寫了2次才寫完,內(nèi)容很長,翻譯了很久,內(nèi)容來源于Cobra github介紹。翻譯完也更全面的了解了Cobra,功能相當強大完善,各種使用的場景都考慮到了。另外也擴展了一些其它知識,比如 命令行玩法 , Levenshtein distance 等等。以下是正文:
為莊河等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及莊河網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為網(wǎng)站建設、成都網(wǎng)站制作、莊河網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
Cobra提供簡單的接口來創(chuàng)建強大的現(xiàn)代化CLI接口,比如git與go工具。Cobra同時也是一個程序, 用于創(chuàng)建CLI程序
Cobra是建立在結(jié)構(gòu)的命令、參數(shù)和標志之上。
命令代表操作,參數(shù)和標志是這些行動的修飾符。
最好的應用程序就像讀取句子。用戶會知道如何使用本機應用程序,因為他們將理解如何使用它。
比如下面的例子, server 是命令, port 是標志:
在下面的命令,我們告訴Git克隆url地址bare
使用Cobra很簡單。首先,使用 go get 安裝最新版本
然后在你項目里引用Cobra
通?;贑obra的應用程序?qū)⒆裱旅娴慕M織結(jié)構(gòu),當然你也可以遵循自己的接口:
在Cobra應用程序中,通常main.go文件非??斩础K饕桓梢患拢撼跏蓟疌obra。
Cobra提供自己的程序來創(chuàng)建你的程序并且添加你想要的命令。這是最簡單的方式把Cobra添加到你的程序里。
這里 你能找到相關信息
使用Cobra,需要創(chuàng)建一個空的main.go文件和一個rootCmd文件。你可以選擇在合適的地方添加額外的命令。
Cobra不需要特殊的構(gòu)造函數(shù)。簡單的就可以創(chuàng)建你的命令。
理想情況下你把這個放在在 app/cmd/root.go
你會另外定義標志和處理配置init()函數(shù)。
比如 cmd/root.go
你需要在main函數(shù)里執(zhí)行root命令。
通常main.go文件非??斩础K饕桓梢患拢撼跏蓟疌obra。
其它的命令通常定義在cmd/目錄下的自己文件內(nèi)
如果你想創(chuàng)建一個version命令,你可以創(chuàng)建cmd/version.go文件,并在文件里這么寫:
標志提供修飾符控制動作命令如何操作
當標志定義好了,我們需要定義一個變量來關聯(lián)標志
'持久'表示每個在那個命令下的命令都將能分配到這個標志。對于全局標志,'持久'的標志綁定在root上。
Cobra默認只在目標命令上解析標志,父命令忽略任何局部標志。通過打開 Command.TraverseChildren Cobra將會在執(zhí)行任意目標命令前解析標志
你同樣可以通過 viper 綁定標志:
在這個例子中,永久的標記 author 被 viper 綁定, 注意 , 當用戶沒有給 --author 提供值, author 不會被賦值。
標記默認是可選的,如果你希望當一個標記沒有設置時,命令行報錯,你可以標記它為必須的
驗證位置參數(shù)可以通過 Command 的 Args 字段。
內(nèi)置下列驗證方法
一個設置自定義驗證的例子
在下面的例子,我們定義了3個命令。2個在頂級,一個(cmdTimes)是其中一個頂級命令的子命令。在這個例子里,由于沒有給 rootCmd 提供 Run ,單獨的root是不能運行的,必須要有子命令。
我們僅為一個命令定義了標記。
更多關于flags的文檔可以在 找到
更完整大型程序的例子, 可以查看 Hugo .
當你的程序有子命令時,Cobra 會自動給你程序添加help命令。當你運行‘a(chǎn)pp help’,會調(diào)用help命令。另外,help同樣支持其它輸入命令。例如,你有一個沒有任何其它配置的命令叫‘create’,當你調(diào)用‘a(chǎn)pp help create’ Corbra 將會起作用。
下面的輸入是 Cobra 自動生成的。除了命令和標志的定義,其它不再需要。
help 就跟其它命令一樣,并沒有特殊的邏輯或行為。事實上,你也可以提供你自己help如果你想的話。
你能為默認的命令,提供你自己的help命令或模板。使用下面的方法:
后2個也將適用于任何子命令
當用戶提供無效的標記或命令,Cobra 將會返回 用法 。
你可能從上面的幫助意識到,默認的幫助將被嵌入到用法里然后作為輸出。
你能提供你自己的用法函數(shù)或模板給 Cobra 使用。
比如幫助,方法和模板都可以重寫。
如果Version字段設置到了根命令,Cobra 會提供了一個頂層 ‘--version’標記。運行帶上‘--version’標記的程序,將會按照模板版本信息。模板可以通過 cmd.SetVersionTemplate(s string) 方法修改
在命令運行前或運行后,再運行方法非常容易。 PersistentPreRun 和 PreRun 方法將會在 Run 之前執(zhí)行。 PersistentPostRun 和 PostRun 方法將會在 Run 之后執(zhí)行。 Persistent*Run 方法會被子命令繼承,如果它們自己沒有定義的話。這些方法將按照下面的屬性執(zhí)行:
下面的例子,2個命令都使用了上面的特性。當子命令執(zhí)行的時候,它將執(zhí)行根命令的 PersistentPreRun ,但不會執(zhí)行根命令的 PersistentPostRun :
輸出:
Cobra 會自動輸出建議,當遇到“unknown command”錯誤時。這使得當輸入錯誤時, Cobra 的行為類似 git 命令。例如:
建議會基于注冊的子命令自動生成。使用了 Levenshtein distance 的實現(xiàn)。每一個注冊的命令會匹配2個距離(忽略大小寫)來提供建議。
如果你希望在你的命令里,禁用建議或虛弱字符串的距離,使用:
或
你可以通過 SuggestFor 來給命令提供明確的名詞建議。這個特性允許當字符串不相近,但是意思與你的命令相近,別切你也不想給該命令設置別名。比如:
Cobra 可以基于子命令,標記,等生成文檔。以以下格式:
Cobra 可以生成一個bash-completion文件。如果你給命令添加更多信息,這些completions可以非常強大和靈活。更多介紹在 Bash Completions 。
1. os.Getwd()函數(shù)
原型:func Getwd()(pwd string, err error)
作用:獲取當前文件路徑
返回:當前文件路徑的字符串和一個err信息
示例:
輸出:
當前路徑: D:ProjectsGomGoLab01
2. os.Getenv()函數(shù)
原型:func Getenv(key string) string
作用:獲取系統(tǒng)環(huán)境變量的值
參數(shù):key - 系統(tǒng)環(huán)境變量名
返回:系統(tǒng)環(huán)境變量的值
示例:
輸出:
環(huán)境變量GOPATH的值是: D:/Projects/Go
3. os.Chdir()函數(shù)
原型:func Chdir(dir string) error
作用:將當前文件路徑改變?yōu)槟繕寺窂剑ǚ钦鎸嵏淖儯?/p>
參數(shù):dir - 目標路徑(即改變之后的路徑)
返回:修改成功,返回 nil;修改失?。ㄈ纾耗繕寺窂讲淮嬖诘那闆r),返回錯誤信息。
示例一:
輸出:
起始路徑: D:ProjectsGomGoLab01
修改后的路徑: D:ProjectsGoDemo02
示例二:
輸出:
起始路徑: D:ProjectsGomGoLab01
error: chdir D:ProjectsGoDemo03: The system cannot find the file specified.
注:文件路徑,Window 系統(tǒng)下默認是“”,寫在代碼中時要用“”或“/”代替。
知識分享之Golang篇是我在日常使用Golang時學習到的各種各樣的知識的記錄,將其整理出來以文章的形式分享給大家,來進行共同學習。歡迎大家進行持續(xù)關注。
知識分享系列目前包含Java、Golang、Linux、Docker等等。
awesome-go 這個組件包含了各種golang中常用的組件,說白了就是一個精選的 Go 框架、庫和軟件的匯總表。
我們?nèi)粘P枰獙ふ腋鞣Ngolang組件時在這個列表中基本都可以快速找到。
本教程介紹了使用 Godatabase/sql及其標準庫中的包訪問關系數(shù)據(jù)庫的基礎知識。
您將使用的database/sql包包括用于連接數(shù)據(jù)庫、執(zhí)行事務、取消正在進行的操作等的類型和函數(shù)。
在本教程中,您將創(chuàng)建一個數(shù)據(jù)庫,然后編寫代碼來訪問該數(shù)據(jù)庫。您的示例項目將是有關老式爵士樂唱片的數(shù)據(jù)存儲庫。
首先,為您要編寫的代碼創(chuàng)建一個文件夾。
1、打開命令提示符并切換到您的主目錄。
在 Linux 或 Mac 上:
在 Windows 上:
2、在命令提示符下,為您的代碼創(chuàng)建一個名為 data-access 的目錄。
3、創(chuàng)建一個模塊,您可以在其中管理將在本教程中添加的依賴項。
運行go mod init命令,為其提供新代碼的模塊路徑。
此命令創(chuàng)建一個 go.mod 文件,您添加的依賴項將在其中列出以供跟蹤。
注意: 在實際開發(fā)中,您會指定一個更符合您自己需求的模塊路徑。有關更多信息,請參閱一下文章。
GO語言(二十五):管理依賴項(上)
GO語言(二十六):管理依賴項(中)
GO語言(二十七):管理依賴項(下)
接下來,您將創(chuàng)建一個數(shù)據(jù)庫。
在此步驟中,您將創(chuàng)建要使用的數(shù)據(jù)庫。您將使用 DBMS 本身的 CLI 創(chuàng)建數(shù)據(jù)庫和表,以及添加數(shù)據(jù)。
您將創(chuàng)建一個數(shù)據(jù)庫,其中包含有關黑膠唱片上的老式爵士樂錄音的數(shù)據(jù)。
這里的代碼使用MySQL CLI,但大多數(shù) DBMS 都有自己的 CLI,具有類似的功能。
1、打開一個新的命令提示符。
在命令行,登錄到您的 DBMS,如下面的 MySQL 示例所示。
2、在mysql命令提示符下,創(chuàng)建一個數(shù)據(jù)庫。
3、切到您剛剛創(chuàng)建的數(shù)據(jù)庫,以便您可以添加表。
4、在文本編輯器的 data-access 文件夾中,創(chuàng)建一個名為 create-tables.sql 的文件來保存用于添加表的 SQL 腳本。
將以下 SQL 代碼粘貼到文件中,然后保存文件。
在此 SQL 代碼中:
(1)刪除名為album表。 首先執(zhí)行此命令可以讓您更輕松地稍后重新運行腳本。
(2)創(chuàng)建一個album包含四列的表:title、artist和price。每行的id值由 DBMS 自動創(chuàng)建。
(3)添加帶有值的四行。
5、在mysql命令提示符下,運行您剛剛創(chuàng)建的腳本。
您將使用以下形式的source命令:
6、在 DBMS 命令提示符處,使用SELECT語句來驗證您是否已成功創(chuàng)建包含數(shù)據(jù)的表。
接下來,您將編寫一些 Go 代碼進行連接,以便進行查詢。
現(xiàn)在你已經(jīng)有了一個包含一些數(shù)據(jù)的數(shù)據(jù)庫,開始你的 Go 代碼。
找到并導入一個數(shù)據(jù)庫驅(qū)動程序,該驅(qū)動程序會將您通過database/sql包中的函數(shù)發(fā)出的請求轉(zhuǎn)換為數(shù)據(jù)庫可以理解的請求。
1、在您的瀏覽器中,訪問SQLDrivers wiki 頁面以識別您可以使用的驅(qū)動程序。
2、使用頁面上的列表來識別您將使用的驅(qū)動程序。為了在本教程中訪問 MySQL,您將使用 Go-MySQL-Driver。
3、請注意驅(qū)動程序的包名稱 - 此處為github.com/go-sql-driver/mysql.
4、使用您的文本編輯器,創(chuàng)建一個用于編寫 Go 代碼的文件,并將該文件作為 main.go 保存在您之前創(chuàng)建的數(shù)據(jù)訪問目錄中。
5、進入main.go,粘貼以下代碼導入驅(qū)動包。
在此代碼中:
(1)將您的代碼添加到main包中,以便您可以獨立執(zhí)行它。
(2)導入 MySQL 驅(qū)動程序github.com/go-sql-driver/mysql。
導入驅(qū)動程序后,您將開始編寫代碼以訪問數(shù)據(jù)庫。
現(xiàn)在編寫一些 Go 代碼,讓您使用數(shù)據(jù)庫句柄訪問數(shù)據(jù)庫。
您將使用指向結(jié)構(gòu)的指針sql.DB,它表示對特定數(shù)據(jù)庫的訪問。
編寫代碼
1、進入 main.go,在import您剛剛添加的代碼下方,粘貼以下 Go 代碼以創(chuàng)建數(shù)據(jù)庫句柄。
在此代碼中:
(3)使用 MySQL 驅(qū)動程序Config和FormatDSN類型以收集連接屬性并將它們格式化為連接字符串的 DSN。
該Config結(jié)構(gòu)使代碼比連接字符串更容易閱讀。
(4)調(diào)用sql.Open 初始化db變量,傳遞 FormatDSN。
(5)檢查來自 的錯誤sql.Open。例如,如果您的數(shù)據(jù)庫連接細節(jié)格式不正確,它可能會失敗。
為了簡化代碼,您調(diào)用log.Fatal結(jié)束執(zhí)行并將錯誤打印到控制臺。在生產(chǎn)代碼中,您會希望以更優(yōu)雅的方式處理錯誤。
(6)調(diào)用DB.Ping以確認連接到數(shù)據(jù)庫有效。在運行時, sql.Open可能不會立即連接,具體取決于驅(qū)動程序。您在Ping此處使用以確認 database/sql包可以在需要時連接。
(7)檢查來自Ping的錯誤,以防連接失敗。
(8)Ping如果連接成功,則打印一條消息。
文件的頂部現(xiàn)在應該如下所示:
3、保存 main.go。
1、開始跟蹤 MySQL 驅(qū)動程序模塊作為依賴項。
使用go get 添加 github.com/go-sql-driver/mysql 模塊作為您自己模塊的依賴項。使用點參數(shù)表示“獲取當前目錄中代碼的依賴項”。
2、在命令提示符下,設置Go 程序使用的DBUSER和DBPASS環(huán)境變量。
在 Linux 或 Mac 上:
在 Windows 上:
3、在包含 main.go 的目錄中的命令行中,通過鍵入go run來運行代碼。
連接成功了!
接下來,您將查詢一些數(shù)據(jù)。