Go cobra:用命令行去构建命令行


Go cobra:用命令行去构建命令行

cobra的图标是眼镜蛇

如果使用Go 去构建命令行,无疑cobra 是最常用的库。今天我们通过使用 cobra 命令去快速构建一个命令行的项目。在介绍cobra之前我们简单介绍一下,一个命令的组成如下:

APPNAME Command --Flags Args 或者 APPNAME Command Args --Flags

譬如

go get -u URL

那么go 就是APPNAME 应用名(二级制程序名称)

get 是Command 命令

u 就是flag 标志

URL 就是 Args 参数

回到主题,我们通过cobra 去构建一个命令,首先是 cobra 安装

go get -u github.com/spf13/cobra/cobra

然后我们创建一个go的项目,这个项目就是通过go 做一个计算器。

go mod init my-calc

接下来就是有趣的事情了,cobra 可以帮我们自动生成代码,执行 init 命令

cobra init --pkg-name cobra add add

然后就可以在项目下产生 cmd 如下:

▾ my-calc/
  ▾ cmd/
     root.go
   main.go

我们可以查看一个main.go 的内容,执行一个cmd。

package main
import "my-calc/cmd"
func main() {
   cmd.Execute()
}

如果我们想给这个命令行加一个 add 的cmd,可以执行

cobra add add

前面一个add 是cobra的cmd,后面一个add 就是我们添加的”加法“ 。我们会看到自动添加add方法

func init() {
   rootCmd.AddCommand(addCmd)

接下来就是实现具体add方法,addInt

Run: func(cmd *cobra.Command, args []string) {
  addInt(args)
},

addInt 会从args里面获取参数如下

func addInt(args []string) {
   var sum int

   for _, ival := range args {
       itemp, err := strconv.Atoi(ival)
       
       if err != nil {
           fmt.Println(err)
       }
       sum = sum + itemp
    }
   fmt.Printf("Addition of numbers %s is %d", args, sum)
}

执行的效果如下

Go cobra:用命令行去构建命令行

如果你想给add 添加一个flag 让它支持 float的加法,可以在上面init 方法里面加一个flag

//add.go
func init() {
 rootCmd.AddCommand(addCmd)
 addCmd.Flags().BoolP("float", "f", false, "Add Floating Numbers")
}

然后修改一下上面的Run方法

Run: func(cmd *cobra.Command, args []string) {
 // 获取flag
 fstatus, _ := cmd.Flags().GetBool("float")
 if fstatus { // 如果是ture 走 addFloat
    addFloat(args)
  } else {
    addInt(args)
  }
},

至于addFloat,我就不粘出来了。这样我们的add 方法就既可以支持init 加法也可以支持float了。效果如下

my-calc add 1.2 2.5 -f

如果我们还想为add 添加一个子命令呢,譬如想实现一个偶数累加器,只将偶数求和

cobra add even

但这个even 方法会追加到 rootcmd里面,这里我们需要手动调整一下。将even 命令加入到addcmd 下面,这样就可以作为add 的子命令了。

// even.go
func init() {
    addCmd.AddCommand(evenCmd)
...
}

具体实现如下

// even.go
Run: func(cmd *cobra.Command, args []string) {
   var evenSum int
   for _, ival := range args {
      itemp, _ := strconv.Atoi(ival)
      if itemp%2 == 0 {
         evenSum = evenSum + itemp
      }
   }
   fmt.Printf("The even addition of %s is %d", args, evenSum)
},

执行的效果如下

Go cobra:用命令行去构建命令行

其他命令,大家感兴趣可以后续自己追加。

展开阅读全文

页面更新:2024-02-29

标签:累加器   偶数   眼镜蛇   加法   计算器   个子   图标   有趣   命令   标志   事情   参数   效果   方法   项目   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top