golang编程cobra-cli库使用

2023-11-03

1、准备

1.1 资源和文档
  • 库:https://github.com/spf13/cobra
  • 文档:https://github.com/spf13/cobra/blob/master/README.md
1.2 下载

使用 go get命令下载:

go get -u github.com/spf13/cobra

2、使用

2.1 基本使用
  • 在工程中新建cmd文件夹,并添加root命令:在cmd文件夹下新建root.go文件,内容如下:
package cmd

import (
	"fmt"
	"github.com/spf13/cobra"
	"os"
)

var rootCmd = &cobra.Command{
	Use: "CobraExample",
	Short: "cobra use example",
	Long: `An application show how to use cobra library.
Author:roc
Blog:makerinchina.cn`,

}

func Excute() {
	if err:= rootCmd.Execute(); err!=nil {
		fmt.Println(err)
		os.Exit(1)
	}
}
  • 然后在main函数中执行,main.go 文件内容如下:
package main

import "cli_cobra_example/cmd"

func main() {
	cmd.Excute()
}

  • 测试

执行 go build,编译程序,然后执行可以看到如下输出:

An application show how to use cobra library.
Author:roc
Blog:makerinchina.cn
2.2 添加自己的命令

有了第一步的基础后,我们可以添加自己的命令,这里添加一个test命令,执行后输出test提示。

  • 先在cmd文件夹下新建test.go 文件,内容如下:
package cmd

import (
	"fmt"
	"github.com/spf13/cobra"
)

var testCmd = &cobra.Command{
	Use: "testCmd",
	Short: "A test cmd",
	Run: testCmdFunc,
}

func testCmdFunc(cmd *cobra.Command, args []string) {
	fmt.Println("test cmd function execute.")

	if len(args) > 0 {
		i := 0
		for i=0;i<len(args);i++ {

			fmt.Printf("  args[%d]:%s\r\n", i, args[i])

		}

	}
}

func init() {
	rootCmd.AddCommand(testCmd)
}

此时编译后执行程序输出如下:

An application show how to use cobra library.
Author:roc
Blog:makerinchina.cn

Usage:
  CobraExample [command]

Available Commands:
  help        Help about any command
  testCmd     A test cmd

Flags:
  -h, --help   help for CobraExample

Use "CobraExample [command] --help" for more information about a command.

如果执行程序带上命令和参数: app testCmd arg1 arg2, 则输出如下:

test cmd function execute.
  args[0]:arg1
  args[1]:arg2

2.3 使用命令标志Flags

(1) 全局命令标志

这种标志定义后会作用于定义它的命令和它的子命令。

  • 在root.go文件添加flags:
package cmd

import (
	"fmt"
	"github.com/spf13/cobra"
	"os"
)

var rootCmd = &cobra.Command{
	Use: "CobraExample",
	Short: "cobra use example",
	Long: `An application show how to use cobra library.
Author:roc
Blog:makerinchina.cn`,
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("root cmd execute function.")


	},
}

var flags1 string

func init() {
	rootCmd.PersistentFlags().StringVarP(&flags1,"flags1","f","default value","flag defined in rootcmd.")
}

func Excute() {
	if err:= rootCmd.Execute(); err!=nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

执行程序并带 -h 参数输出如下:

An application show how to use cobra library.
Author:roc
Blog:makerinchina.cn

Usage:
  CobraExample [flags]
  CobraExample [command]

Available Commands:
  help        Help about any command
  testCmd     A test cmd

Flags:
  -f, --flags1 string   flag defined in rootcmd. (default "default value")
  -h, --help            help for CobraExample

Use "CobraExample [command] --help" for more information about a command.

然后执行程序并带子命令参数: app testCmd -h,也会有-f的标志,输出如下:

A test cmd

Usage:
  CobraExample testCmd [flags]

Flags:
  -h, --help   help for testCmd

Global Flags:
  -f, --flags1 string   flag defined in rootcmd. (default "default value")

(2) 特定命令标志

这种标志仅仅用于定义它的命令。

  • 修改test.go文件如下:
package cmd

import (
	"fmt"
	"github.com/spf13/cobra"
)

var testCmd = &cobra.Command{
	Use: "testCmd",
	Short: "A test cmd",
	Run: testCmdFunc,
}

var testFlag1 string

func testCmdFunc(cmd *cobra.Command, args []string) {
	fmt.Println("test cmd function execute.")

	if len(args) > 0 {
		i := 0
		for i=0;i<len(args);i++ {

			fmt.Printf("  args[%d]:%s\r\n", i, args[i])

		}

	}

	strflag, _ := cmd.Flags().GetString("testflag")
	fmt.Println("local cmd flags:", strflag)

	strflagroot, _ := rootCmd.Flags().GetString("flags1")
	fmt.Println("root cmd flags:", strflagroot)
}

func init() {
	rootCmd.AddCommand(testCmd)

	testCmd.Flags().StringVarP(&testFlag1,"testflag","t","default value1", "test cmd flag1")
}
  • 执行子命令 testCmd:
app testCmd -h 

可以看到输出如下:

A test cmd

Usage:
  CobraExample testCmd [flags]

Flags:
  -h, --help              help for testCmd
  -t, --testflag string   test cmd flag1 (default "default value1")

Global Flags:
  -f, --flags1 string   flag defined in rootcmd. (default "default value")
  • 执行命令并输出标志参数:
app  testCmd arg1 -f global_flag -t local_flag

输出结果如下:

test cmd function execute.
  args[0]:arg1
local cmd flags: local_flag
root cmd flags: global_flag
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang编程cobra-cli库使用 的相关文章

  • 如何在 Go 中解组可以是数组或字符串的字段?

    我正在尝试解组该文件 babel email protected cdn cgi l email protection licenses MIT repository https github com babel babel tree ma
  • Golang导入包错误

    go 5 2 在以下任一位置找不到包 github com googollee go socket io usr local go src github com googollee go socket io 来自 GOROOT Users
  • 为什么我无法导入“内置”pkg?

    cat test go package main import builtin func main return go run test go can t find import builtin 我只是好奇 因为该文件存在并且已正确打包 但
  • 如何将 interface{} 转换回其原始结构?

    我需要一种方法将结构 接口动态转换回其原始对象 我可以在里面添加方法 函数 基本上我需要这样的东西 MyStruct gt Interface gt MyStruct 在最终转换时 除了结构内部的内容之外 我对原始结构一无所知 所以我不能这
  • 切片文字中的求值顺序

    我最近浏览了Go的 语言规范 https golang org ref spec Order of evaluation https golang org ref spec Order of evaluation但发现评估顺序与本文档中解释
  • 从 C 调用带有字符串参数的 Go 函数?

    我可以从 C 调用一个没有参数的 Go 函数 按照下面的 https github com joeprivacy crefgo hello world 这通过编译go build和打印 Hello from Golang main func
  • ConstantTimeByteEq 如何工作?

    在大神的密码库里 找到了这个函数ConstantTimeByteEq http golang org src pkg crypto subtle constant time go s 897 936 L17 它有什么作用 如何工作 Cons
  • 空或不需要的结构字段

    我有两个结构体 代表将插入到 mongodb 数据库中的模型 一个结构 投资 将另一个结构 集团 作为其字段之一 type Group struct Base Name string json name bson name type Inv
  • 如果覆盖率低于一定百分比,则单元测试失败

    我制作了一个执行的 makefilego test cover 是否有可能失败make unit tests如果覆盖范围低于 X 则命令 我该怎么做呢 您可以使用TestMain在你的测试中做到这一点 TestMain 可以充当测试的自定义
  • 读取一个文本文件,替换其中的单词,输出到另一个文本文件

    所以我试图在 GO 中编写一个程序来获取一个充满代码的文本文件并将其转换为 GO 代码 然后将该文件保存到 GO 文件或文本文件中 我一直在试图弄清楚如何保存对文本文件所做的更改 但我可以看到更改的唯一方法是通过 println 语句 因为
  • Go中funcappend的实现在哪里?

    我对 go 非常感兴趣 并尝试阅读 go 函数的实现 我发现其中一些函数没有实现 如追加或调用 The append built in function appends elements to the end of a slice If i
  • 使用 Golang 通道处理 HTTP 请求

    我正在尝试构建一个简单的 Golang Appengine 应用程序 它使用通道来处理每个 http 请求 原因是我希望每个请求执行合理的大型内存计算 并且每个请求都以线程安全的方式执行 即来自并发请求的计算不会混合 这一点很重要 本质上
  • formatFloat :将浮点数转换为字符串[重复]

    这个问题在这里已经有答案了 http golang org pkg strconv http golang org pkg strconv http play golang org p 4VNRgW8WoB http play golang
  • golang:使用 gin 路由器服务 net.Conn

    我有一个处理传入 TCP 连接的函数 func Handle conn net Conn error 另外 我有一个初始化的 gin 路由器 带有已实现的句柄 router gin New router GET router POST Th
  • 当所有通道都关闭时中断 select 语句

    我有两个独立生成数据的 goroutine 每个将其发送到一个通道 在我的主 goroutine 中 我想在每个输出进入时使用它们 但不关心它们进入的顺序 每个通道在耗尽其输出时都会自行关闭 虽然 select 语句是像这样独立使用输入的最
  • 具有多个等待组的管道中通道范围内的死锁

    我正在练习通过同时将计算分为 100 组来计算阶乘的挑战 我解决了 WaitGroups 上的很多问题 但仍然处于calculateFactorial函数我在通道部分的范围上陷入了僵局 希望有人能指出这个问题 谢谢 package main
  • Cgo 生成的源无法在 MVC 上编译

    我有一个用 CGo 制作的共享库 它在 Linux 和 Android 上链接得很好 但是 当使用 Microsoft Visual Studio 2017 在 Windows 10 上进行编译时 出现以下错误 Microsoft R Pr
  • Go 中数组的嵌套结构

    我已经开始使用https mholt github io json to go https mholt github io json to go 将 API JSON 转换为 go 结构 我真的很喜欢它 但是我对如何初始化如下所示的报告定义
  • 使用 google.protobuf.Timestamp 在 Go 中解析带有时区偏移的日期时间戳

    我正在创建一个将使用 GRPC 和 protobuf 的 Go 应用程序 我的 RPC 服务应获取包含类型的消息google protobuf Timestamp 解析它并最终将其保存在数据库中或对其执行更多操作 我对什么被认为是该类型的有
  • 如何使用 Java 原生接口从 Java 调用 Go 函数?

    可以通过以下方式调用 C 方法JNA https en wikipedia org wiki Java Native AccessJava 中的接口 如何使用 Go 实现相同的功能 package main import fmt impor

随机推荐

  • vue遍历输出列表中以逗号隔开的字符串

    问题描述 后台接口返回一个以逗号隔开的字符串 在列表中需要将逗号隔开的字符串便利并将对应的用户编号转换成为用户姓名 代码展示 列表代码
  • Spring事务(三)——传播属性之REQUIRED

    事务是与连接对象紧密相关的 事务属性用来控制事务流转 Spring事务的传播属性有以下几种 Propagation REQUIRED 如果当前没有事务 就新建一个事务 如果已经存在一个事务中 则加入到这个事务中 默认属性 也是最常使用 Pr
  • Linux中修改MAC地址和IP地址的命令(netset、ip、ifconfig)

    修改MAC地址 ip link set eth0 address aa aa aa aa aa aa 解析 eth0是网卡的名字 可以用ifconfig命令查看 aa aa aa aa aa aa是想要修改后的MAC地址 修改IP地址 1
  • webBrowser对跳转后的页面的处理

    代码 using System using System Collections Generic using System ComponentModel using System Data using System Drawing usin
  • 浏览器检查页面的几种方式 b7faf554fecf4718b9bf5035708ff528

    浏览器检查页面的几种方式 前言 初学前端和爬虫的小伙伴应该有会遇到很多让人很头疼的小问题 例如 再遇到一个很有趣的网页时 想要探究一下这个网站的页面构造 但是在尝试鼠标右键时却无法像其他网站一样出菜单 在比如要对某个网站进行抓包 想要进入开
  • AIGC时代的王者:微软

    从2022年到2023年这不到一年的时间 AI圈经历两大爆火事件 Stable diffusion和chatGPT 正式宣布AIGC时代的到来 在这背后有一家一直被认为科技创新性较弱的公司在默默的努力着 田字牌即微软 chatGPT爆火之前
  • 原来tuxera ntfs for Mac激活码这么容易获取

    因为Tuxera NTFS可以帮助我们在Mac上完全读写NTFS磁盘 所以非常受大家的欢迎 这款软件可以使用一段时间 让大家体验它的便捷性 不过在试用期过去之后就需要我们激活这款软件才可以继续使用的 那么怎么才能正确获得Tuxera NTF
  • 生成4位不重复的字符串

    实际的业务场景中需要生成4位不重复的字符串 这个场景比较特殊 不具有普遍性 正常场景的唯一单号都不会只有4位 最先想到的是随机生成4位字符串 字符包括数字 大小写字母一共62位 基本可以满足使用要求 但是越到后面 重复的概率就会越大 想要保
  • latex 矩阵分块(block matrix)

    Lesson 12 Making Block Matrices in LATEX 按列分块 AAb An 1b left begin array c c c c A Ab cdots A n 1 b end array right left
  • 【排序算法】归并排序(C语言)

    排序算法 归并排序 C语言 目录 一 归并排序的原理 二 两个有序数组排序和合并 1 原地排序 2 创建临时空间 二 递归实现 三 非递归实现 1 实现思路 2 数组边界问题 3 代码实现 一 归并排序的原理 归并排序 MergeSort
  • import numpy as np_最新Python学习教程(Python学习路线):Numpy常用用法总结

    最新Python学习教程 Python学习路线 Numpy常用用法总结 一 前言 玩数据分析 数据挖掘 AI的都知道这个python库用的是很多的 里面包含各种操作 在实际的dataset的处理当中是非常常用的 这里我做一个总结 方便自己看
  • stm32项目平衡车详解(stm32F407)上

    stm32项目 stm32项目介绍值平衡车 本文章学习借鉴于创客学院团队 以表感谢 教学视频 文章目录 stm32项目 前言 一 平衡小车 平衡小车的功能介绍 平衡小车功能开发需求 平衡小车整体框架 小车环境数据采集进程 1 平衡小车姿态信
  • docker进入容器修改配置文件

    一 以root权限进入容器 sudo docker exec ti u root 容器id bin bash 二 安装apt get 依次执行 apt get update apt get install y vim 三 进入要编辑的目录
  • 数据请求方式fetch

    一 前言 在前后端分离项目中 前端请求后端接口得到后端数据 完成页面内容的渲染或功能状态的判断 已经成为常规操作 那么 关于前端如何请求后端接口获取并解析数据 主要有哪些方式呢 刷新页面 最直接但是最体验最差的一种方式 form表单 会触发
  • 遗传算法【matlab实现】(内含matlab基础式注释)

    最近在准备数学建模 凭借微弱的matlab基础学习遗传算法等一系列最优化算法实在是有点吃力 想着帮助自己消化吸收 帮助其他小白同学快速看懂代码 所以写了一篇blog 给出了遗传算法的大致实现思路 但重点是里面傻瓜式的代码注释 详细到了每一个
  • 《SOA 原理•方法•实践》作者毛新生先生签名售书活动

    SOA 原理 方法 实践 作者 毛新生 先生签名售书活动 2007 年8月24日 北京香格里拉 毛新生 先生将在 SOA 架构你的未来 大会现场签名售书 更多详情请访问 http www 900 ibm com cn express kin
  • 快手适合在美妆行业做广告投放吗?快手广告如何计费?

    根据统计数据 化妆品类电商评论中提及短视频声量较去年同期增长367 可见短视视频的广告投放方式深受广大用户喜欢 所以 快手适合做美妆广告吗 我们一起来看一看 一 快手平台适合做化妆品行业的广告吗 由于以下原因 快手很适合做美妆行业的广告投放
  • Deconfounded Visual Grounding

    本文内容仅代表个人理解 如有错误 欢迎指正 1 Background knowledge 这篇论文重度包含因果推理的相关知识 本文可能会粗略带过 感兴趣的可以去看看原论文 有比较详细的解释说明 Q1 什么是confounder confou
  • UIImagePickerController iOS11调起相册 中的照片被导航栏遮挡

    为了适配iOS11下来刷新下下偏移问题 全局设置了 UIScrollView appearance 的ContentInsetAdjustmentBehavior为UIScrollViewContentInsetAdjustmentNeve
  • golang编程cobra-cli库使用

    1 准备 1 1 资源和文档 库 https github com spf13 cobra 文档 https github com spf13 cobra blob master README md 1 2 下载 使用 go get命令下载