前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang 反射1: 使用反射绑定 cobra flag 参数

golang 反射1: 使用反射绑定 cobra flag 参数

作者头像
老麦
发布2022-12-24 09:49:31
3080
发布2022-12-24 09:49:31
举报
文章被收录于专栏:Go与云原生Go与云原生

cobra https://github.com/spf13/cobra 是 golang 中一个非常好用的 命令 开发库。

但是绑定 flag 参数的时候略微有点繁琐, 不但有多少个参数就需要写多少行绑定代码, 而且参数定义和描述也是分开的, 非常的不直观。

代码语言:javascript
复制
 func init() {
     rootCmd.Flags().StringVarP(&stu.Name, "name", "", "zhangsanfeng", "student name")
     rootCmd.Flags().Int64VarP(&stu.Age, "age", "a", 18, "student age")
     // ...
 }

想着吧, 反正都要了解 golang reflect 反射, 不如就用 反射 实现一个绑定支持。老实说, 反射一开始用起来, 还真让人头疼, 各种转换绕来绕去。所有操作步骤都在代码中有了简单明了的注释 https://github.com/go-jarvis/cobrautils/blob/master/flagx.go

完成后,只需要一行代码就可以完成所有绑定。还真是挺香的。

代码语言:javascript
复制
 cobrautils.BindFlags(rootCmd, &stu)

安装

代码语言:javascript
复制
 go get -u github.com/go-jarvis/cobrautils

使用方式

Attention: 由于 cobra 中对数据的处理方法很细致, 因此数据目前支持 int, int64, uint, uint64

flag 与 cobra 定义一致

代码语言:javascript
复制
 func (f *FlagSet) Uint64VarP(p *uint64, name, shorthand string, value uint64, usage string) {
   f.VarP(newUint64Value(value, p), name, shorthand, usage)
 }

flag 设置

代码语言:javascript
复制
 type student struct {
     Name    string `flag:"name" usage:"student name" persistent:"true"`
     Age     int64  `flag:"age" usage:"student age" shorthand:"a"`
 }
  1. flag:"config" : flag 的名字, --config, 嵌套 struct 之间使用 . 连接, --config.password
  2. shorthand:"c" : 参数简写 -c, 简写没有潜逃
  3. usage:"comment balalal": 参数说明
  4. persistent : 全局

默认值设置

由于所有参数的值最终都需要一个接收者, 保存之后才能够被调用。因此, 默认值的设置就放在 struct 实例化一个对象中。

代码语言:javascript
复制
 stu := student{
     Name:   "zhangsanfeng",
     Age:    20100
 }

键值绑定

代码语言:javascript
复制
 // 绑定
 cobrautils.BindFlags(rootCmd, &stu)
 _ = rootCmd.Execute()
 
 // 打印结果
 fmt.Printf("%+v", stu)

完整 Demo

代码语言:javascript
复制
 package main
 
 import (
     "fmt"
 
     "github.com/go-jarvis/cobrautils"
     "github.com/spf13/cobra"
 )
 
 type student struct {
     Name    string `flag:"name" usage:"student name" persistent:"true"`
     Age     int64  `flag:"age" usage:"student age" shorthand:"a"`
 }
 
 var rootCmd = &cobra.Command{
     Use: "root",
     Run: func(cmd *cobra.Command, args []string) {
         _ = cmd.Help()
     },
 }
 
 func main() {
     stu := student{
         Name:   "zhangsanfeng",
         Age:    20100
     }
 
     cobrautils.BindFlags(rootCmd, &stu)
     _ = rootCmd.Execute()
 
     fmt.Printf("%+v", stu)
 }

执行结果

代码语言:javascript
复制
go run . --name wenzhaolun
Usage:
    root [flags]
Flags:
    -a, --age int            student age (default 20100)
    -h, --help               help for root
        --name string        student name (default "zhangsanfeng")

{Name:wenzhaolun Age:20100}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 熊猫云原生Go 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • 使用方式
    • flag 设置
      • 默认值设置
        • 键值绑定
        • 完整 Demo
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档