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重要的三个概念。

以上是关于Golang三剑客之PflagViperCobra的主要内容,如果未能解决你的问题,请参考以下文章

三剑客之SED行天下

谢烟客---------Linux之文本处理三剑客之grep

三剑客之 sed详解

三剑客之 sed详解

文本处理三剑客之AWK

Docker三剑客之Compose