欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

GO Cobra Termui庫開發(fā)終端命令行小工具輕松上手

 更新時間:2024年01月08日 14:26:30   作者:南丞?PFinalClub  
這篇文章主要為大家介紹了GO語言開發(fā)終端命令行小工具,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

Golang實現(xiàn)命令行小工具

"看到有人用Rust寫終端天氣查詢小工具,一時興起,用Golang也做了個命令行小工具,效果如下:"

其實用golang 來寫終端小工具,還是很方便的,有許多可用的庫比如這里用到的 Cobra,Termui庫.

Cobra 庫

cobra是一個命令行程序庫,可以用來編寫命令行程序。同時,它也提供了一個腳手架, 用于生成基于 cobra 的應(yīng)用程序框架。非常多知名的開源項目使用了 cobra 庫構(gòu)建命令行,如Kubernetes、Hugo、etcd等等等等。

安裝

go get github.com/spf13/cobra/cobra

注意: 安裝完成以后,先去 go/bin/ 下找找 看是否有這個命令

使用

新建一個項目文件夾 pf_tools 然后進(jìn)入項目中 執(zhí)行:

cobra-cli init

就會初始化一個命令項目,結(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開發(fā)的 小工具集合
   - pft pf_wt 查詢天氣
   - pft pf_m 手機歸屬地查詢
`,
	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 代表一個命令,其各個屬性含義如下:

  • Use 是命令的名稱。
  • Short 代表當(dāng)前命令的簡短描述。
  • Long 表示當(dāng)前命令的完整描述。
  • Run 屬性是一個函數(shù),當(dāng)執(zhí)行命令時會調(diào)用此函數(shù)。

rootCmd.Execute() 是命令的執(zhí)行入口,其內(nèi)部會解析 os.Args[1:] 參數(shù)列表(默認(rèn)情況下是這樣,也可以通過 Command.SetArgs 方法設(shè)置參數(shù)),然后遍歷命令樹,為命令找到合適的匹配項和對應(yīng)的標(biāo)志。

添加子命令

因為小工具不止一個功能,所以需要添加子命令,如:

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:  `查詢對應(yīng)手機的歸屬地`,
	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)
}

沒啥特殊的, 就是添加一個命令, 然后初始化一下,然后實現(xiàn)功能.

Termui 庫

為了能夠在終端顯示的好看, 就使用了 termui 的庫, termui是構(gòu)建在termbox-go之上的一個跨平臺的完全可自定義的終端dashboard 以及widget 庫

安裝

因為使用了 go mod 來管理,所以這里就不用 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":
		}
	}

手機查詢的使用了 List 小組件,代碼如下:

 defer ui.Close()
	l := widgets.NewList()
	l.Title = "號碼詳細(xì)信息"
	l.Rows = []string{
		"[0] 查詢的號碼:" + pr.PhoneNum,
		"[1] 號碼運營商:" + pr.CardType,
		"[2] 號碼所在省份:" + pr.Province,
		"[3] 號碼所在城市:" + 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)沒有大的變化, Termui 官方的 github 倉庫中有例子, 但是 官方的例子中,有些 屬性沒有使用, 比如 table.Titlel.TitleStyle 這種,需要自己嘗試去寫

代碼地址

https://github.com/GoFinalPack/pf_tools 

最后愉快的玩耍吧

以上就是GO語言開發(fā)終端命令行小工具輕松上手的詳細(xì)內(nèi)容,更多關(guān)于GO開發(fā)終端命令行小工具的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言的文件操作代碼匯總

    Go語言的文件操作代碼匯總

    本文給大家匯總介紹了go語言中的文件操作的代碼,包括文件的讀寫,文件的新建打開和刪除等,希望對大家學(xué)習(xí)go語言能夠有所幫助
    2018-10-10
  • Go語言基礎(chǔ)語法之結(jié)構(gòu)體及方法詳解

    Go語言基礎(chǔ)語法之結(jié)構(gòu)體及方法詳解

    結(jié)構(gòu)體類型可以用來保存不同類型的數(shù)據(jù),也可以通過方法的形式來聲明它的行為。本文將介紹go語言中的結(jié)構(gòu)體和方法,以及“繼承”的實現(xiàn)方法
    2021-09-09
  • golang中snappy的使用場合實例詳解

    golang中snappy的使用場合實例詳解

    在java 和go語言 大字符傳達(dá)的時候, 采用snappy 壓縮 解壓縮是最好的方案。下面這篇文章主要給大家介紹了關(guān)于golang中snappy使用場合的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-12-12
  • 詳解go-zero如何實現(xiàn)計數(shù)器限流

    詳解go-zero如何實現(xiàn)計數(shù)器限流

    這篇文章主要來和大家說說限流,主要包括計數(shù)器限流算法以及具體的代碼實現(xiàn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08
  • 一文詳解Go語言中的Option設(shè)計模式

    一文詳解Go語言中的Option設(shè)計模式

    這篇文章主要為大家詳細(xì)介紹了Go語言中Option設(shè)計模式的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的可以了解一下
    2023-05-05
  • Go語言內(nèi)建函數(shù)cap的實現(xiàn)示例

    Go語言內(nèi)建函數(shù)cap的實現(xiàn)示例

    cap 是一個常用的內(nèi)建函數(shù),它用于獲取某些數(shù)據(jù)結(jié)構(gòu)的容量,本文主要介紹了Go語言內(nèi)建函數(shù)cap的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • Go語言數(shù)據(jù)類型詳細(xì)介紹

    Go語言數(shù)據(jù)類型詳細(xì)介紹

    這篇文章主要介紹了Go語言數(shù)據(jù)類型詳細(xì)介紹,Go語言數(shù)據(jù)類型包含基礎(chǔ)類型和復(fù)合類型兩大類,下文關(guān)于這兩類型的相關(guān)介紹,需要的小伙伴可以參考一下
    2022-03-03
  • Go語言 如何實現(xiàn)RSA加密解密

    Go語言 如何實現(xiàn)RSA加密解密

    這篇文章主要介紹了Go語言實現(xiàn)RSA加密解密的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go語言中的逃逸分析究竟是什么?

    Go語言中的逃逸分析究竟是什么?

    這篇文章主要介紹了Go語言中的逃逸,套喲究竟是什么呢?通俗來講,當(dāng)一個對象的指針被多個方法或線程引用時,我們稱這個指針發(fā)生了“逃逸”。下面文章將詳細(xì)介紹Go語言中的逃逸,需要的朋友可以參考一下
    2021-09-09
  • 重學(xué)Go語言之錯誤處理與異常機制詳解

    重學(xué)Go語言之錯誤處理與異常機制詳解

    Go語言的開發(fā)者顯然覺得?try-catch被濫用了,因此?Go不支持使用?try-catch語句捕獲異常處理,那么,Go語言是如何定義和處理程序的異常呢,下面我們就來看看吧
    2023-08-08

最新評論