Golang三剑客之PflagViperCobra
Posted 刘贤松
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang三剑客之PflagViperCobra相关的知识,希望对你有一定的参考价值。
如何构建应用框架
想知道如何构建应用框架,首先你要明白,
一个应用框架包含哪些部分。在我看来,一个应用框架需要包含以下 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中文社区
实例 : 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重要的三个概念。
- 命令(Commands)代表动作
- 参数(Args)代表事件
- 标示(Flags)是对动作的修饰
好的命令行应该像自然语句一样流畅,让用户一眼就明白其作用。
例如以下例子,docker
是根命令,pull
是命令。 - Golang Cobra的使用 - 简书
- 代码参考: Go 每日一库之 cobra - 大俊的博客
以上是关于Golang三剑客之PflagViperCobra的主要内容,如果未能解决你的问题,请参考以下文章