GO Cobra Termui庫(kù)開(kāi)發(fā)終端命令行小工具輕松上手
Golang實(shí)現(xiàn)命令行小工具
"看到有人用Rust寫終端天氣查詢小工具,一時(shí)興起,用Golang也做了個(gè)命令行小工具,效果如下:"


其實(shí)用golang 來(lái)寫終端小工具,還是很方便的,有許多可用的庫(kù)比如這里用到的 Cobra,Termui庫(kù).
Cobra 庫(kù)
cobra是一個(gè)命令行程序庫(kù),可以用來(lái)編寫命令行程序。同時(shí),它也提供了一個(gè)腳手架, 用于生成基于 cobra 的應(yīng)用程序框架。非常多知名的開(kāi)源項(xiàng)目使用了 cobra 庫(kù)構(gòu)建命令行,如Kubernetes、Hugo、etcd等等等等。
安裝
go get github.com/spf13/cobra/cobra
注意: 安裝完成以后,先去 go/bin/ 下找找 看是否有這個(gè)命令
使用
新建一個(gè)項(xiàng)目文件夾 pf_tools 然后進(jìn)入項(xiàng)目中 執(zhí)行:
cobra-cli init
就會(huì)初始化一個(gè)命令項(xiàng)目,結(jié)構(gòu)如下:
├── LICENSE
├── README.md
├── cmd
│ ├── pfM.go
│ ├── pfWt.go
│ └── root.go
├── go.mod
├── go.sum
├── main.go
└── pak
├── mobile.go
└── weather.go其中, cmd 目錄中默認(rèn)生成 root.go 文件,代碼如下:
package cmd
import (
"os"
"github.com/spf13/cobra"
)
var rootCmd = &cobra.Command{
Use: "pf_tools",
Short: "pft",
Long: `基于go開(kāi)發(fā)的 小工具集合
- pft pf_wt 查詢天氣
- pft pf_m 手機(jī)歸屬地查詢
`,
Run: func(cmd *cobra.Command, args []string) {
if len(args) == 0 {
err := cmd.Help()
if err != nil {
return
}
return
}
},
}
func Execute() {
err := rootCmd.Execute()
if err != nil {
os.Exit(1)
}
}
func init() {
rootCmd.Flags().BoolP("version", "v", false, "")
}cobra.Command 代表一個(gè)命令,其各個(gè)屬性含義如下:
- Use 是命令的名稱。
- Short 代表當(dāng)前命令的簡(jiǎn)短描述。
- Long 表示當(dāng)前命令的完整描述。
- Run 屬性是一個(gè)函數(shù),當(dāng)執(zhí)行命令時(shí)會(huì)調(diào)用此函數(shù)。
rootCmd.Execute() 是命令的執(zhí)行入口,其內(nèi)部會(huì)解析 os.Args[1:] 參數(shù)列表(默認(rèn)情況下是這樣,也可以通過(guò) Command.SetArgs 方法設(shè)置參數(shù)),然后遍歷命令樹,為命令找到合適的匹配項(xiàng)和對(duì)應(yīng)的標(biāo)志。
添加子命令
因?yàn)樾」ぞ卟恢挂粋€(gè)功能,所以需要添加子命令,如:
cobra-cli add pf_m

代碼和 root.go 中的代碼相似,也是那幾步,
package cmd
import (
"github.com/pfinal/pf_tools/pak"
"github.com/spf13/cobra"
)
// pfMCmd represents the pfM command
var pfMCmd = &cobra.Command{
Use: "pf_m",
Short: "pfm",
Long: `查詢對(duì)應(yīng)手機(jī)的歸屬地`,
Run: func(cmd *cobra.Command, args []string) {
if len(args) == 0 {
_ = cmd.Help()
return
}
if pak.CheckMobile(args[0]) == false {
_ = cmd.Help()
return
}
m := pak.Mobile{}
m.GetInfo(args[0])
},
}
func init() {
rootCmd.AddCommand(pfMCmd)
}沒(méi)啥特殊的, 就是添加一個(gè)命令, 然后初始化一下,然后實(shí)現(xiàn)功能.
Termui 庫(kù)
為了能夠在終端顯示的好看, 就使用了 termui 的庫(kù), termui是構(gòu)建在termbox-go之上的一個(gè)跨平臺(tái)的完全可自定義的終端dashboard 以及widget 庫(kù)
安裝
因?yàn)槭褂昧?go mod 來(lái)管理,所以這里就不用 go get 了,直接使用 go mod 即可.
代碼中導(dǎo)入:
ui "github.com/gizak/termui/v3" "github.com/gizak/termui/v3/widgets"
然后 go mod tidy 然后mod 自己下載去吧
布局
前面天氣查詢的 使用了 Table 小組件, 代碼如下:
defer ui.Close()
table := widgets.NewTable()
table.Title = res.City + "天氣"
table.BorderStyle = ui.NewStyle(ui.ColorRed)
table.Rows = [][]string{
[]string{"日期", "天氣", "風(fēng)向", "體感溫度"},
}
for _, v := range res.Weather {
table.Rows = append(table.Rows, []string{v.Date, v.Weather, v.Wind, v.Temp})
}
table.TextStyle = ui.NewStyle(ui.ColorGreen)
table.TitleStyle = ui.NewStyle(ui.ColorGreen)
table.SetRect(0, 0, 60, 10)
ui.Render(table)
uiEvents := ui.PollEvents()
for {
e := <-uiEvents
switch e.ID {
case "q", "<C-c>":
return
case "c":
}
}手機(jī)查詢的使用了 List 小組件,代碼如下:
defer ui.Close()
l := widgets.NewList()
l.Title = "號(hào)碼詳細(xì)信息"
l.Rows = []string{
"[0] 查詢的號(hào)碼:" + pr.PhoneNum,
"[1] 號(hào)碼運(yùn)營(yíng)商:" + pr.CardType,
"[2] 號(hào)碼所在省份:" + pr.Province,
"[3] 號(hào)碼所在城市:" + pr.City,
"[4] 所在城市郵編:" + pr.ZipCode,
"[5] 所在地區(qū)編碼:" + pr.AreaZone,
}
l.TextStyle = ui.NewStyle(ui.ColorGreen)
l.TitleStyle = ui.NewStyle(ui.ColorGreen)
l.WrapText = false
l.SetRect(0, 0, 40, 8)
ui.Render(l)
previousKey := ""
uiEvents := ui.PollEvents()結(jié)構(gòu)沒(méi)有大的變化, Termui 官方的 github 倉(cāng)庫(kù)中有例子, 但是 官方的例子中,有些 屬性沒(méi)有使用, 比如 table.Title, l.TitleStyle 這種,需要自己嘗試去寫
代碼地址
https://github.com/GoFinalPack/pf_tools
最后愉快的玩耍吧
以上就是GO語(yǔ)言開(kāi)發(fā)終端命令行小工具輕松上手的詳細(xì)內(nèi)容,更多關(guān)于GO開(kāi)發(fā)終端命令行小工具的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語(yǔ)言基礎(chǔ)語(yǔ)法之結(jié)構(gòu)體及方法詳解
結(jié)構(gòu)體類型可以用來(lái)保存不同類型的數(shù)據(jù),也可以通過(guò)方法的形式來(lái)聲明它的行為。本文將介紹go語(yǔ)言中的結(jié)構(gòu)體和方法,以及“繼承”的實(shí)現(xiàn)方法2021-09-09
golang中snappy的使用場(chǎng)合實(shí)例詳解
在java 和go語(yǔ)言 大字符傳達(dá)的時(shí)候, 采用snappy 壓縮 解壓縮是最好的方案。下面這篇文章主要給大家介紹了關(guān)于golang中snappy使用場(chǎng)合的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-12-12
詳解go-zero如何實(shí)現(xiàn)計(jì)數(shù)器限流
這篇文章主要來(lái)和大家說(shuō)說(shuō)限流,主要包括計(jì)數(shù)器限流算法以及具體的代碼實(shí)現(xiàn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-08-08
一文詳解Go語(yǔ)言中的Option設(shè)計(jì)模式
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中Option設(shè)計(jì)模式的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下2023-05-05
Go語(yǔ)言內(nèi)建函數(shù)cap的實(shí)現(xiàn)示例
cap 是一個(gè)常用的內(nèi)建函數(shù),它用于獲取某些數(shù)據(jù)結(jié)構(gòu)的容量,本文主要介紹了Go語(yǔ)言內(nèi)建函數(shù)cap的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08
Go語(yǔ)言 如何實(shí)現(xiàn)RSA加密解密
這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)RSA加密解密的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05
重學(xué)Go語(yǔ)言之錯(cuò)誤處理與異常機(jī)制詳解
Go語(yǔ)言的開(kāi)發(fā)者顯然覺(jué)得?try-catch被濫用了,因此?Go不支持使用?try-catch語(yǔ)句捕獲異常處理,那么,Go語(yǔ)言是如何定義和處理程序的異常呢,下面我們就來(lái)看看吧2023-08-08

