golang 反射1: 使用反射绑定 cobra flag 参数
2023-06-13 09:16:10 时间
cobra
https://github.com/spf13/cobra 是 golang 中一个非常好用的 命令 开发库。
但是绑定 flag
参数的时候略微有点繁琐, 不但有多少个参数就需要写多少行绑定代码, 而且参数定义和描述也是分开的, 非常的不直观。
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
完成后,只需要一行代码就可以完成所有绑定。还真是挺香的。
cobrautils.BindFlags(rootCmd, &stu)
安装
go get -u github.com/go-jarvis/cobrautils
使用方式
Attention: 由于 cobra 中对数据的处理方法很细致, 因此数据目前支持
int, int64, uint, uint64
。
flag 与 cobra
定义一致
func (f *FlagSet) Uint64VarP(p *uint64, name, shorthand string, value uint64, usage string) {
f.VarP(newUint64Value(value, p), name, shorthand, usage)
}
flag 设置
type student struct {
Name string `flag:"name" usage:"student name" persistent:"true"`
Age int64 `flag:"age" usage:"student age" shorthand:"a"`
}
flag:"config"
: flag 的名字,--config
, 嵌套 struct 之间使用.
连接,--config.password
shorthand:"c"
: 参数简写-c
, 简写没有潜逃usage:"comment balalal"
: 参数说明persistent
: 全局
默认值设置
由于所有参数的值最终都需要一个接收者, 保存之后才能够被调用。因此, 默认值的设置就放在 struct
实例化一个对象中。
stu := student{
Name: "zhangsanfeng",
Age: 20100
}
键值绑定
// 绑定
cobrautils.BindFlags(rootCmd, &stu)
_ = rootCmd.Execute()
// 打印结果
fmt.Printf("%+v", stu)
完整 Demo
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)
}
执行结果
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}
相关文章
- 【说站】java反射机制原理详解
- 2-反射
- Golang的反射reflect深入理解和示例
- Python 异常处理与反射机制
- 「Golang 反射实战」 - 我用反射写了一个配置库 - envutils , 应用变更再也不会少变量了
- 代理与反射(二)
- 【EventBus】事件通信框架 ( 订阅方法注册 | 检查订阅方法缓存 | 反射获取订阅类中的订阅方法 )
- Java – 如何通过反射调用对象的方法详解编程语言
- Java反射机制详解编程语言
- 利用反射型XSS二次注入绕过CSP form-action限制
- 关于web安全的反射型xss实战演示
- C#反射技术的简单操作(读取和设置类的属性)
- 基于反射解决类复制的实现方法
- 基于Java回顾之反射的使用分析
- Android依据名字通过反射获取在drawable中的图片
- PHP反射类ReflectionClass和ReflectionObject的使用方法
- java根据方法名称取得反射方法的参数类型示例
- c#测试反射性能示例