GO Cobra Termui库开发终端命令行小工具轻松上手

 更新时间:2024年01月08日 14:26:30   作者:南丞 PFinalClub  
这篇文章主要为大家介绍了GO语言开发终端命令行小工具,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Golang实现命令行小工具

"看到有人用Rust写终端天气查询小工具,一时兴起,用Golang也做了个命令行小工具,效果如下:"

其实用golang 来写终端小工具,还是很方便的,有许多可用的库比如这里用到的 Cobra,Termui库.

Cobra 库

cobra是一个命令行程序库,可以用来编写命令行程序。同时,它也提供了一个脚手架, 用于生成基于 cobra 的应用程序框架。非常多知名的开源项目使用了 cobra 库构建命令行,如Kubernetes、Hugo、etcd等等等等。

安装

go get github.com/spf13/cobra/cobra

注意: 安装完成以后,先去 go/bin/ 下找找 看是否有这个命令

使用

新建一个项目文件夹 pf_tools 然后进入项目中 执行:

cobra-cli init

就会初始化一个命令项目,结构如下:

├── LICENSE
├── README.md
├── cmd
│   ├── pfM.go
│   ├── pfWt.go
│   └── root.go
├── go.mod
├── go.sum
├── main.go
└── pak
    ├── mobile.go
    └── weather.go

其中, cmd 目录中默认生成 root.go 文件,代码如下:

package cmd
import (
	"os"
	"github.com/spf13/cobra"
)
var rootCmd = &cobra.Command{
	Use:   "pf_tools",
	Short: "pft",
	Long: `基于go开发的 小工具集合
   - 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 代表当前命令的简短描述。
  • Long 表示当前命令的完整描述。
  • Run 属性是一个函数,当执行命令时会调用此函数。

rootCmd.Execute() 是命令的执行入口,其内部会解析 os.Args[1:] 参数列表(默认情况下是这样,也可以通过 Command.SetArgs 方法设置参数),然后遍历命令树,为命令找到合适的匹配项和对应的标志。

添加子命令

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

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:  `查询对应手机的归属地`,
	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)
}

没啥特殊的, 就是添加一个命令, 然后初始化一下,然后实现功能.

Termui 库

为了能够在终端显示的好看, 就使用了 termui 的库, termui是构建在termbox-go之上的一个跨平台的完全可自定义的终端dashboard 以及widget 库

安装

因为使用了 go mod 来管理,所以这里就不用 go get 了,直接使用 go mod 即可.

代码中导入:

 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{"日期", "天气", "风向", "体感温度"},
	}
	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 = "号码详细信息"
	l.Rows = []string{
		"[0] 查询的号码:" + pr.PhoneNum,
		"[1] 号码运营商:" + pr.CardType,
		"[2] 号码所在省份:" + pr.Province,
		"[3] 号码所在城市:" + pr.City,
		"[4] 所在城市邮编:" + pr.ZipCode,
		"[5] 所在地区编码:" + 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()

结构没有大的变化, Termui 官方的 github 仓库中有例子, 但是 官方的例子中,有些 属性没有使用, 比如 table.Titlel.TitleStyle 这种,需要自己尝试去写

代码地址

https://github.com/GoFinalPack/pf_tools 

最后愉快的玩耍吧

以上就是GO语言开发终端命令行小工具轻松上手的详细内容,更多关于GO开发终端命令行小工具的资料请关注脚本之家其它相关文章!

相关文章

  • 一文带你了解Go中的内存对齐

    一文带你了解Go中的内存对齐

    一旦涉及到较为底层的编程,特别是与硬件交互,内存对齐是一个必修的课题,所以这篇文章小编就想来和大家聊一聊Go语言中的内存对齐,希望对大家有所帮助
    2023-10-10
  • Go语言中的函数式编程实践

    Go语言中的函数式编程实践

    这篇文章主要介绍了Go语言中的函数式编程实践,主要讲解Go语言中的函数式编程概念和使用。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Go语言开源库实现Onvif协议客户端设备搜索

    Go语言开源库实现Onvif协议客户端设备搜索

    这篇文章主要为大家介绍了Go语言Onvif协议客户端设备搜索示例实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • go 对象池化组件 bytebufferpool使用详解

    go 对象池化组件 bytebufferpool使用详解

    这篇文章主要为大家介绍了go 对象池化组件 bytebufferpool使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • golang使用go test输出单元测试覆盖率的方式

    golang使用go test输出单元测试覆盖率的方式

    单元测试覆盖率是衡量代码质量的一个重要指标,重要的代码文件覆盖率应该至少达到80%以上,Java 可以通过JaCoCo 统计覆盖率,那么go 项目如何进行代码覆盖率测试呢,本文将给大家详细的介绍一下golang使用go test输出单元测试覆盖率的方式,需要的朋友可以参考下
    2024-02-02
  • Golang中文件目录操作的实现步骤详解

    Golang中文件目录操作的实现步骤详解

    在Golang中,文件目录是指计算机文件系统中的文件夹或目录。目录是用于组织和存储文件的一种方式,可以包含文件和其他子目录,本文主要介绍了Golang中文件目录操作的实现方法,需要的朋友可以参考下
    2023-05-05
  • 使用Golang读取toml配置文件的代码实现

    使用Golang读取toml配置文件的代码实现

    在开发过程中,配置文件是必不可少的一部分,它使我们能够在不更改代码的情况下更改应用程序的行为,TOML是一种简单易读的配置文件格式,本文将介绍如何使用Golang来读取TOML配置文件,需要的朋友可以参考下
    2024-04-04
  • 详解Go语言中Goroutine退出机制的原理及使用

    详解Go语言中Goroutine退出机制的原理及使用

    goroutine是Go语言提供的语言级别的轻量级线程,在我们需要使用并发时,我们只需要通过 go 关键字来开启 goroutine 即可。本文就来详细讲讲Goroutine退出机制的原理及使用,感兴趣的可以了解一下
    2022-07-07
  • golang模拟TCP粘包和拆包

    golang模拟TCP粘包和拆包

    粘包是指在发送多个小的数据包时,接收端会将这些数据包合并成一个数据包接收,拆包是指发送的数据包在传输过程中被分割成多个小包,下面我们来看看go如何模拟TCP粘包和拆包吧
    2024-12-12
  • golang中net的tcp服务使用

    golang中net的tcp服务使用

    这篇文章主要介绍了golang中net的tcp服务使用,文章通过服务端监听端口 展开主题的详细内容,具有一定的参考价值,需要的 小伙伴可以参考一下
    2022-04-04

最新评论