Go cobra笔记

本文最后更新于:几秒前

Cobra 是一个 Golang 包,它提供了简单的接口来创建命令行程序。同时,Cobra 也是一个应用程序,用来生成应用框架,从而开发以 Cobra 为基础的应用

Cobra 介绍

  • Cobra 是一个功能强大的现代化CLI应用程序库
  • 有很多知名的Go项目使用Cobra进行构建,比如k8s,Docker,Hugo等
  • 比默认的flag包强大很多

Cobra 概念

Cobra是由Commands,arguments,flags组成的 比如下面例子:

kubelet get pods -n kube-system
  • app应用程序: kubelet
  • command: get 表示具体的操作
  • args: pods 表示参数
  • flags: 是这些操作的修饰符 比如 -n
  • args: kube-system

Cobra 安装和应用

获取第三方包的时候,通过代理,可以加速下载访问

export GOPROXY=https://goproxy.cn

cobra 安装

go mod init my-calc 
go get -u github.com/spf13/cobra/cobra

cobra 初始化项目

(base) ➜  my-calc cobra init  --pkg-name my-calc 
Your Cobra application is ready at
/Users/budongshu/go/my-calc

cobra 执行流程

修改root.go代码

image-20201214002612850

![image-20201214002630682](/Users/budongshu/Library/Application Support/typora-user-images/image-20201214002630682.png)

修改main.go 代码

image-20201214002657535

下面可以看到输出流程

#  go run main.go 
I am init 
I am main 
I am initConfig

cobra 添加一个命令sum

sum子命令实现把后面的参数args 跟的int 数字进行 求和

//通过cobra 添加一个子命令  会生成sum.go 代码 
# cobra add sum
// sum 1 2 3 
# go run main.go sum 1 2 3 
sum called
Sum of num: [1 2 3] is  6

上面生成的sum.go代码 我们通过修改sum.go来实现

func intSum(args []string) {
	var sum int
	for _,val := range args {
		temp,err := strconv.Atoi(val)
		if err  != nil {
			fmt.Printf("convert %s to int is error; %v\n",val,err)
			continue
		}
		sum += temp
	}
	fmt.Printf("Sum of num: %s is  %d\n",args,sum)
}

在sum.go 上面这里引用

image-20201214003227592

在sum 基础上添加支持float 数据类型的 求和

//在sum.go 下面添加floatSum函数
func floatSum(args []string) {
	var sum1 float64
	for _,valf := range args{
		tempf,errf := strconv.ParseFloat(valf,64)
		if errf  != nil {
			fmt.Printf("convert %s to float is error %v\n",valf,errf)
			continue
		}
		sum1 += tempf
	}
	fmt.Printf("sum float64 num: %s is %f\n",args,sum1)

}
//在 sum.go中 加入sum 命令本地使用的args 是一个布尔类型的判断
func init() {
	rootCmd.AddCommand(sumCmd)
	sumCmd.Flags().BoolP("float","f",false,"Sum float numbers")  //新添加
//在sum.go 中 	

	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("sum called")
		//以下新添加代码,因为上面加一个布尔值,默认是false,可以用来使用,返回的布尔值进行判断
		fStatus,_ := cmd.Flags().GetBool("float")
		if fStatus {   //如果是True 那就是float ,false 为int
			floatSum(args)
		} else {
			intSum(args)
		}
	},
}

在sum基础上添加子命令

在sum基础上,加入一个子命令,进行求偶数和的功能

# cobra add even
package cmd

import (
	"fmt"
	"strconv"

	"github.com/spf13/cobra"
)

// evenCmd represents the even command
var evenCmd = &cobra.Command{
	Use:   "even",
	Short: "A brief description of your command",
	Long: `A longer description that spans multiple lines and likely contains examples
and usage of using your command. For example:

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("even called")
		evenSum(args)  //新加入代码
	},
}

//下面为新加入函数
func init() {
  //这里面要改成sumCmd 这样才可以做为sum的子命令
	sumCmd.AddCommand(evenCmd)
}
func evenSum( args []string) {
	var sum int
	for _,val := range args {
		temp,_ := strconv.Atoi(val)
		if temp % 2 == 0 {
			sum += temp
		}
	}
	fmt.Printf("%s even %v\n",args,sum)
}

执行结果

(base) ➜  my-calc go run main.go sum  even 1 2 3 6  
even called
[1 2 3 6] even 8

最后看帮助信息

go run main.go -h
Usage:
  my-calc [command]

Available Commands:
  help        Help about any command
  sum         A brief description of your command

Flags:
      --config string   config file (default is $HOME/.my-calc.yaml)
  -h, --help            help for my-calc
  -t, --toggle          Help message for toggle

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

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!