Go 语言项目开发实战
孔令飞
腾讯云专家工程师,前 Red Hat、联想云工程师
41030 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 61 讲
Go 语言项目开发实战
15
15
1.0x
00:00/00:00
登录|注册

22 | 应用构建三剑客:Pflag、Viper、Cobra 核心功能介绍

序列化成字符串
反序列化
访问嵌套的键
使用标志
使用环境变量
设置配置值
监听和重新读取配置文件
读取配置文件
设置默认值
隐藏标志
弃用标志或者标志的简写
指定了选项但是没有指定选项值时的默认值
获取非选项参数
使用Get<Type>获取参数的值
支持多种命令行参数定义方式
Pflag、Viper、Cobra的使用
其他特性
PreRun and PostRun Hooks
非选项参数验证
使用标志
使用Cobra库创建命令
读取配置
读入配置
Pflag使用方法
FlagSet定义
Flag定义
应用的命令行框架
配置文件解析
命令行参数解析
课后练习
总结
Cobra
Viper
Pflag
应用框架构建
应用构建三剑客

该思维导图由 AI 生成,仅供参考

你好,我是孔令飞。这一讲我们来聊聊构建应用时常用的 Go 包。
因为 IAM 项目使用了 Pflag、Viper 和 Cobra 包来构建 IAM 的应用框架,为了让你后面学习更加容易,这里简单介绍下这 3 个包的核心功能和使用方式。其实如果单独讲每个包的话,还是有很多功能可讲的,但我们这一讲的目的是减小你后面学习 IAM 源码的难度,所以我会主要介绍跟 IAM 相关的功能。
在正式介绍这三个包之前,我们先来看下如何构建应用的框架。

如何构建应用框架

想知道如何构建应用框架,首先你要明白,一个应用框架包含哪些部分。在我看来,一个应用框架需要包含以下 3 个部分:
命令行参数解析:主要用来解析命令行参数,这些命令行参数可以影响命令的运行效果。
配置文件解析:一个大型应用,通常具有很多参数,为了便于管理和配置这些参数,通常会将这些参数放在一个配置文件中,供程序读取并解析。
应用的命令行框架:应用最终是通过命令来启动的。这里有 3 个需求点,一是命令需要具备 Help 功能,这样才能告诉使用者如何去使用;二是命令需要能够解析命令行参数和配置文件;三是命令需要能够初始化业务代码,并最终启动业务进程。也就是说,我们的命令需要具备框架的能力,来纳管这 3 个部分。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了Go语言应用构建中常用的Pflag、Viper和Cobra三个包的使用方法。首先强调了构建应用框架的重要性,包括命令行参数解析、配置文件解析和应用的命令行框架。重点介绍了Pflag包的使用方法,包括支持多种命令行参数定义方式、获取参数的值、获取非选项参数等。此外,还介绍了Viper包作为配置解析神器的重要性,以及Viper的配置读入和读取功能。文章通过详细的代码示例和解释,使读者能够快速了解这些包的核心功能和使用方式。总的来说,本文为Go语言应用开发者提供了宝贵的工具和技术指导,帮助他们更高效地构建应用程序。文章还介绍了Cobra作为一个现代化的命令行框架,提供了创建命令、添加标志等功能。通过对Cobra的介绍,读者可以了解如何使用Cobra库创建命令,以及如何使用标志和绑定到Viper等功能。整体而言,本文内容丰富,适合Go语言开发者学习和应用。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言项目开发实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(17)

  • 最新
  • 精选
  • Sch0ng
    使用Pflag解析命令行参数,使用Viper解析配置文件,使用Cobra实现命令行框架。 复用优秀轮子省时省力。

    作者回复: 老哥,学的好认真呀,给点个赞!

    2021-08-12
    13
  • 总结一下: 1:cobra = flag+启动流程管理 2: viper读取配置文件+flag参数 最后 反序列化出来一个配置struct实例 ps 最终代码里没有pflag包的事

    作者回复: 6666

    2022-01-27
    7
  • 宙斯
    有个疑问:flag和非选项参数数什么关系呢?

    作者回复: 比如:./iam-apiserver -c /etc/iam/iam-apiserver.yaml -c是flag。 /etc/iam/iam-apiserver是非选项参数。

    2021-07-27
    2
    7
  • 龍捲風
    想问下,关于golang的项目怎么实现优雅下线?注册中心可以将服务节点剔除,但关闭服务时怎么让已接收到请求可以做完呢?

    作者回复: net/http包有提供ShutDown方法。 第24讲:Web 服务:Web 服务核心功能有哪些,如何实现?有讲如何实现优雅关停。

    2021-07-16
    4
  • Geek_8efe79
    全是文字看着好心累,没有视频?

    作者回复: 后面考虑出个视频课程

    2022-04-18
    3
  • helloworld
    开发环境,测试环境,生产环境的配置文件是不同的,关于不同环境下读取配置文件,这块有什么好的最佳实践吗,是通过命令行参数指定不同环境的配置文件的方式好呢,还是通过系统环境变量来区分环境并读取对应配置文件好呢

    作者回复: 如果参数少,比如< 5个,可以在命令行参数指定。 如果参数 >=5个,最好在配置文件指定,好维护。 注意:5 不是标准答案,需要你来定。

    2021-07-16
    3
    2
  • Neroldy
    标志可以是“持久的”,这意味着该标志可用于它所分配的命令以及该命令下的每个子命令。 老师能再具体讲讲这个标志的持久化是什么意思吗?

    作者回复: 就是如果一个标志是“持久的”,那么子命令也可以使用父命令的标志。

    2021-07-15
    2
  • 我要去卖冰淇淋
    老师我有个疑问.例如 我现在要在别的方法中引用yaml中配置的变量,但在代码中我没有发现global存配置文件的信息,难道只能 1。自己声明一个全局了存储,2 直接用 viper.GetString("xxx.xxx") 方式。 我在观察代码的时候 发现所有的初始化信息基本上都是在 启动之初处理好了。

    作者回复: 这个地方是个取舍,没有标准答案,完全可以根据自己的需求来; 建议变量都在初始化中,通过参数的方式进行传递,因为这样能做到有感知。但可能每次都加一个参数传递,觉得麻烦,也完全可以搞个全局变量,问题不大的。

    2022-10-27归属地:广东
    2
    1
  • czy
    Viper读取配置部分第2种方法反序列化两个示例解释的很不清楚,过于晦涩了,不如用一个简单的例子,这两个例子是官方上的,就直接翻译搬过来了吧?也没有加一些解析。

    作者回复: 感谢反馈,我优化下

    2022-08-29归属地:广东
  • 雪峰
    viper在容器中无法watch

    作者回复: 可以watch,需要改下文件的软连接。容器中,文件路径跟真实的路径不一样,具体你可以网上搜索,然后尝试下。

    2022-08-24归属地:广东
收起评论
显示
设置
留言
17
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部