cobrautils 使用反射获取 flag 配置, 支持指针字段

简介: cobrautils 使用反射获取 flag 配置, 支持指针字段

cobrautils 使用反射获取 flag 配置, 支持指针字段

image.png

cobrautils 通过反射方法, 解析 struct 字段中的 特定 参数, 绑定 flag 。

安装

go get -u github.com/go-jarvis/cobrautils

使用方式

Attention: 由于 cobra 中对数据的处理方法很细致, 因此数据目前支持
  1. 字符串:

    • string, *string
  2. 数字:

    • int, int64, uint, uint64
    • *int, *int8, *int16, *int32, *int64
    • *uint, *uint8, *uint16, *uint32, *uint64
  3. 布尔类型:

    • bool, *bool
  4. 切片:

    • []string, []int, []int64
  5. 时间:

    • 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"`
}
  1. flag:"config" : flag 的名字, --config, 嵌套 struct 之间使用 . 连接, --config.password
  2. shorthand:"c" : 参数简写 -c, 简写没有潜逃
  3. usage:"comment balalal": 参数说明
  4. 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

QA

kind and type

相较于 Type 而言,Kind 所表示的范畴更大。 类似于家用电器(Kind)和电视机(Type)之间的对应关系。或者电视机(Kind)和 42 寸彩色电视机(Type)

Type 是类型。Kind 是类别。Type 和 Kind 可能相同,也可能不同。

  1. 通常基础数据类型的 Type 和 Kind 相同
  2. 自定义数据类型则不同。

对于反射中的 kind 我们既可以通过 reflect.Type 来获取,也可以通过 reflect.Value 来获取。他们得到的值和类型均是相同的。

相关文章
java.lang.NullPointerExceptionMybatisPlus出现,测试,java.lang.NullPointe,空指针异常,public方法少写了一个字段,没加注解
java.lang.NullPointerExceptionMybatisPlus出现,测试,java.lang.NullPointe,空指针异常,public方法少写了一个字段,没加注解
|
Go
Golang 语言怎么打印结构体指针类型字段的值?
Golang 语言怎么打印结构体指针类型字段的值?
270 0
|
20天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
81 12
|
6月前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
2月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
32 0
|
3月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
110 4
|
4月前
|
C语言
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
|
4月前
|
C语言
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)