Golang三剑客之Pflag、Viper、Cobra

2023-11-20

如何构建应用框架

想知道如何构建应用框架,首先你要明白,

一个应用框架包含哪些部分。在我看来,一个应用框架需要包含以下 3 个部分:

  • 命令行参数解析:主要用来解析命令行参数,这些命令行参数可以影响命令的运行效果。
  • 配置文件解析:一个大型应用,通常具有很多参数,为了便于管理和配置这些参数,通常会将这些参数放在一个配置文件中,供程序读取并解析。
  • 应用的命令行框架:应用最终是通过命令来启动的。这里有 3 个需求点,一是命令需要具备 Help 功能,这样才能告诉使用者如何去使用;二是命令需要能够解析命令行参数和配置文件;三是命令需要能够初始化业务代码,并最终启动业务进程。也就是说,我们的命令需要具备框架的能力,来纳管这 3 个部分

Pflag 特点:

pflag 包与 flag 包的工作原理甚至是代码实现都是类似的,下面是 pflag 相对 flag 的一些优势:

  • 支持更加精细的参数类型:例如,flag 只支持 uint 和 uint64,而 pflag 额外支持 uint8、uint16、int32 等类型。
  • 支持更多参数类型:ip、ip mask、ip net、count、以及所有类型的 slice 类型。
  • 兼容标准 flag 库的 Flag 和 FlagSet:pflag 更像是对 flag 的扩展。
  • 原生支持更丰富的功能:支持 shorthand、deprecated、hidden 等高级功能。

实例:golang学习笔记---pflag包 - 清明-心若淡定 - 博客园

package main

import flag "github.com/spf13/pflag"
import (
    "fmt"
    "strings"
)

// 定义命令行参数对应的变量
var cliName = flag.StringP("name", "n", "nick", "Input Your Name")
var cliAge = flag.IntP("age", "a",22, "Input Your Age")
var cliGender = flag.StringP("gender", "g","male", "Input Your Gender")
var cliOK = flag.BoolP("ok", "o", false, "Input Are You OK")
var cliDes = flag.StringP("des-detail", "d", "", "Input Description")
var cliOldFlag = flag.StringP("badflag", "b", "just for test", "Input badflag")

func wordSepNormalizeFunc(f *flag.FlagSet, name string) flag.NormalizedName {
    from := []string{"-", "_"}
    to := "."
    for _, sep := range from {
        name = strings.Replace(name, sep, to, -1)
    }
    return flag.NormalizedName(name)
}

func main() {
    // 设置标准化参数名称的函数
    flag.CommandLine.SetNormalizeFunc(wordSepNormalizeFunc)
    
    // 为 age 参数设置 NoOptDefVal
    flag.Lookup("age").NoOptDefVal = "25"

    // 把 badflag 参数标记为即将废弃的,请用户使用 des-detail 参数
    flag.CommandLine.MarkDeprecated("badflag", "please use --des-detail instead")
    // 把 badflag 参数的 shorthand 标记为即将废弃的,请用户使用 des-detail 的 shorthand 参数
    flag.CommandLine.MarkShorthandDeprecated("badflag", "please use -d instead")

    // 在帮助文档中隐藏参数 gender
    flag.CommandLine.MarkHidden("badflag")

    // 把用户传递的命令行参数解析为对应变量的值
    flag.Parse()

    fmt.Println("name=", *cliName)
    fmt.Println("age=", *cliAge)
    fmt.Println("gender=", *cliGender)
    fmt.Println("ok=", *cliOK)
    fmt.Println("des=", *cliDes)
}

viper 特点:

  • 支持 JSON/TOML/YAML/HCL/envfile/Java properties 等多种格式的配置文件;
  • 可以设置监听配置文件的修改,修改时自动加载新的配置;
  • 从环境变量、命令行选项和io.Reader中读取配置;
  • 从远程配置系统中读取和监听修改,如 etcd/Consul;
  • 代码逻辑中显示设置键值。
  • Go 每日一库之 viper - Go语言中文网 - Golang中文社区
//初始化
func init()  {
	viper.SetConfigFile("./config/config.yaml") // 指定配置文件路径
	err := viper.ReadInConfig()               // 读取配置信息
	if err != nil {                           // 读取配置信息失败
		panic(fmt.Errorf("Fatal error config file: %s \n", err))
	}
	// 将读取的配置信息保存至全局变量Conf
	if err := viper.Unmarshal(Conf); err != nil {
		panic(fmt.Errorf("unmarshal conf failed, err:%s \n", err))
	}
	// 监控配置文件变化
	viper.WatchConfig()
	// 注意!!!配置文件发生变化后要同步到全局变量Conf
	viper.OnConfigChange(func(in fsnotify.Event) {
		fmt.Println("夭寿啦~配置文件被人修改啦...")
		if err := viper.Unmarshal(Conf); err != nil {
			panic(fmt.Errorf("unmarshal conf failed, err:%s \n", err))
		}
	})
}

    实例 : https://github.com/spf13/viper

package main

import (
	"flag"
	"github.com/spf13/pflag"
)

func main() {

	// using standard library "flag" package
	flag.Int("flagname", 1234, "help message for flagname")

	pflag.CommandLine.AddGoFlagSet(flag.CommandLine)
	pflag.Parse()
	viper.BindPFlags(pflag.CommandLine)

	i := viper.GetInt("flagname") // retrieve value from viper

	// ...
}

Cobra特点:

命令(Commands),参数(Args)和标识(Flags)是Cobra重要的三个概念。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Golang三剑客之Pflag、Viper、Cobra 的相关文章

随机推荐

  • 在VMware中给win10/win7虚拟机配置静态IP地址(保姆级教学,全是干货)

    1 点击VMware菜单栏的编辑 进入虚拟网络编辑器 2 点击更改设置 3 选择NAT模式 取消勾选 使用本地DHCP服务将IP地址分配给虚拟机 然后点击NAT设置 查看并记住网关IP 然后关闭NAT设置窗口 回到虚拟编辑器页面 点击确定
  • 51单片机 数码管中断操作

    实践目的 1 掌握中断的概念和思想 2 掌握51单片机中断系统和相关软硬件设计 实践内容 1 利用单片机的P0口接数码管的字段脚 P1 0脚接共阴极 P3 2 P3 3引脚接独立按键产生外部中断信号 编写程序 当程序正常运行时数码管显示H字
  • 如何保护您的数据免受.malox勒索病毒的威胁?

    简介 malox勒索病毒是2022年就开始出现的一种恶意软件 它以其强大的加密算法和恶意行为而闻名 91数据恢复将在本文深入探讨 malox勒索病毒的特征 以及被 malox勒索病毒加密的数据文件的恢复方法 帮助受害者了解如何应对这一威胁
  • vue3使用babel-plugin-import按需引入element-plus

    vue3使用babel plugin import按需引入element plus 2022年6月13日更新 用babel plugin import按需引入element plus会有问题 用官方推荐的方式真香了 以下是链接 https
  • Unity旋转以及万向锁问题

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触
  • 如何在linux系统下创建空白文本.txt文件

    如何在linux系统下创建空白文本 txt文件 跳转到要新建文本的目录下 打开终端 输入命令 最后 跳转到要新建文本的目录下 可利用cd命令在终端跳转 或者直接到要新建文件的目录文件夹中 打开终端 输入命令 touch 文本名 txt 例如
  • MySQL之索引

    数据库中的索引与书的目录相似 表中的数据类似于书的内容 书的目录有助于读者快速地找到书中相关的内容 数据库的索引有助于加快数据检索速度 目前大部分MySQL索引都是以B 树 BTREE 方式存储的 BTREE方式构建了包含多个节点的一棵树
  • pyqt点击按钮执行脚本

    class NineGridApp QWidget def init self super init self initUI def initUI self self setWindowTitle 测试常见的操作 self setGeome
  • ClassUtils.getClassFileName()方法具有什么功能呢?

    转自 ClassUtils getClassFileName 方法的功能简介说明 下文笔者讲述ClassUtils getClassFileName方法的功能简介说明 如下所示 ClassUtils getClassFileName 方法的
  • 异或运算总结

    其实主要是想介绍一些关于异或的一些例题 方便自己的复习 目录 什么是异或运算 异或运算的性质 异或性质的应用 什么是异或运算 异或 xor 是一个数学运算符 它应用于逻辑运算 异或的数学符号为 计算机符号为 xor 其运算法则为 a b a
  • GPT系列训练与部署——GPT2环境配置与模型训练

    本文为博主原创文章 未经博主允许不得转载 本文为专栏 Python从零开始进行AIGC大模型训练与推理 系列文章 地址为 https blog csdn net suiyingy article details 130169592 Colo
  • APP INVENTOR调用HTTPClient

    APP INVENTOR调用HTTPClient APP中使用HTTPClient调用api 这里使用的是聚合数据提供的API 使用所有的API都是大同小异 参数的参数有所不同 我们这里使用post方式 传回的是json格式 在解析了以后
  • malloc、calloc、realloc、free函数的使用

    malloc realloc calloc free函数大部分在 stdlib h 文件中 malloc 函数 从堆上分配内存 calloc 函数 从堆上分配内存并清零 realloc 函数 在之前分配的内存块的基础上 将内存重新分配为更大
  • anaconda虚拟环境

    1 先看有哪些虚拟环境 conda env list 或者 conda info e 2 创建虚拟环境 conda create n 环境名 python X X X X是python版本 比如3 7 3 激活制定虚拟环境 linux so
  • HighLight

    前言 今天给大家介绍下Highlight Highlight相关属性 the x value of the highlighted value private float mX Float NaN the y value of the hi
  • 用DART来实现远程控制WinPE(类似于teamview)

    In the new Dart 7 release part of MDOP 2011 R2 Microsoft added a remote connection application to WinPE it allows you to
  • APT攻击流程图画法参考

    APT攻击流程图画法参考 画图网站 多组件多阶段 多文件多次网络连接行为 ATTCK Kill Chain 画图网站 我用免费的ProcessOn 图标比较多也好看 个人免费文件是9个 如果不够用只能删了 花钱是不可能花钱的 删之前可以保存
  • vue实现批量打印

  • 数据压缩实验之 H.264编解码实验

    文章目录 1 将两个 264文件进行解码 得到相应的YUV文件 2 将上述两个视频序列编码为 264文件 2 1 固定码率 以不同的GOP长度及形状编码 2 1 1 GOP 15 2B帧 2 1 2 GOP 12 2B帧 2 1 3 GOP
  • Golang三剑客之Pflag、Viper、Cobra

    如何构建应用框架 想知道如何构建应用框架 首先你要明白 一个应用框架包含哪些部分 在我看来 一个应用框架需要包含以下 3 个部分 命令行参数解析 主要用来解析命令行参数 这些命令行参数可以影响命令的运行效果 配置文件解析 一个大型应用 通常