cobrax 使用反射获取 flag 配置, 支持指针字段
2023-02-18 16:29:07 时间
cobrax 使用反射获取 flag 配置, 支持指针字段
cobrax 通过反射方法, 解析 struct 字段中的 特定 参数, 绑定 flag 。
安装
go get -u github.com/go-jarvis/cobrautils
使用方式
Attention: 由于 cobra 中对数据的处理方法很细致, 因此数据目前支持
- 字符串:
string, *string
- 数字:
int, int64, uint, uint64
。*int, *int8, *int16, *int32, *int64
*uint, *uint8, *uint16, *uint32, *uint64
- 布尔类型:
bool, *bool
- 切片:
[]string, []int, []int64
- 时间:
timeDuration, *time.Duration
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"`
NamePtr *string `flag:"nameptr" usage:"student name" persistent:"true"`
AgePtr *int64 `flag:"ageptr" usage:"student age" shorthand:"a"`
}
flag:"config"
: flag 的名字,--config
, 嵌套 struct 之间使用.
连接,--config.password
shorthand:"c"
: 参数简写-c
, 简写没有潜逃usage:"comment balalal"
: 参数说明persistent
: 全局
flag 设置指针
从 v1.3.0 开始, flag 支持有限指针集, 以解决常用类型的 0 值问题。
包括 *string, *int, *int64, *bool
https://runsisi.com/2019/04/29/go-pointer-flag/
默认值设置
由于所有参数的值最终都需要一个接收者, 保存之后才能够背调用。 因此, 默认值的设置就放在 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}
Demo
: example
相关文章
- 不想加班开发管理后台了,试试这个 Java 开源项目吧!
- 用 Java 训练出一只“不死鸟”
- 用 Java 训练深度学习模型,原来可以这么简单!
- [Java 开源项目]一款无需写任何代码,即可一键生成前后端代码的工具
- 用 Java 做个“你画手机猜”的小游戏
- DJL 之 Java 玩转多维数组,就像 NumPy 一样
- 用 Java 拿下 HTML 分分钟写个小爬虫
- 完全基于 Java 的开源深度学习平台,亚马逊的大佬带你上手
- 带你上手阿里开源的 Java 诊断利器:Arthas
- Java的深拷贝和浅拷贝的区别
- Java中Elasticsearch 实现分页方式(三种方式)
- Java二分法
- Java求值策略
- Java锁
- Ansible PlayBook语法
- Ansible 通过Playbook部署LAMP
- InnoDB的锁(Locking)
- Ansible 通过PlayBook部署Zabbix
- 一次死锁(Dead Lock)分析
- 【matplotlib】3-绘制统计图形