热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

「GoCN酷Go推荐」env环境变量获取库

背景对于编译成二进制文件的程序而言,其本身就是一个黑盒子。程序的外部控制主要由三个部分组成:命令行参数,配置文件和环境变量。之前的文章中&

背景

对于编译成二进制文件的程序而言,其本身就是一个黑盒子。程序的外部控制主要由三个部分组成:命令行参数,配置文件和环境变量。之前的文章中,我们已经拥有命令行参数工具库cobra,配置文件读取库viper,今天我们来了解一下在环境变量读取库中的一员env。

安装

go get github.com/caarlos0/env/v6

使用案例

package mainimport ("fmt""time""github.com/caarlos0/env/v6"
)type config struct {Home         string        `env:"HOME"`Port         int           `env:"PORT" envDefault:"3000"`Password     string        `env:"PASSWORD,unset"`IsProduction bool          `env:"PRODUCTION"`Hosts        []string      `env:"HOSTS" envSeparator:":"`Duration     time.Duration `env:"DURATION"`TempFolder   string        `env:"TEMP_FOLDER" envDefault:"${HOME}/tmp" envExpand:"true"`
}func main() {cfg := config{}if err := env.Parse(&cfg); err != nil {fmt.Printf("%+v\n", err)}fmt.Printf("%+v\n", cfg)
}

接下来我们针对代码中涉及的tag逐一进行分析:

  • env:环境变量的获取名。

    • unset:与env逗号隔开,表明环境变量值获取之后即刻清理,通常用于私密数据。

    • file:将对应文件内容读取赋值。

    • required: 毕竟从环境变量中读取到。

    • notEmpty: 非空

  • envDefault:顾名思义,当获取不到环境变量值时的默认值。

  • envSeparator: 当变量是字符串数组时,此值对应切分时使用的字符。

  • envExpand:通常与envDefault配合使用,允许使用环境变量对envDefault的值格式化。

扩展

env库的公开函数中,使用ParseWithFuncs可以传入自定义的类型解析函数,其类型为map[reflect.Type]func(v string) (interface{}, error)。如此通过形如type Myint int的方式,让解析过程能拥有更大的灵活性。

源码悄悄看

env库的主要功能源码不过500行,其中使用了大量reflect库的反射机制,用于对环境变量值到结构体成员类型的转换,defaultBuiltInParsers定义了其默认的类型解析函数。解析流程:

  • 通过os.Environ()获得环境变量字符串key=value形式,转换成map[string]string结构。

  • 通过反射循环获取结构体变量信息,包括变量类型和对应tag

  • 使用设定对应的解析函数,其中若是结构体则递归调用

  • 根据tag指定的逻辑对解析后的值进行判断和处理

  • 对结构体变量赋值

总结

环境变量在程序中的使用随着微服务项目的普及而越来越常见。环境变量可以看作是操作系统层面的配置文件,因此我们通常会把与业务相关的参数写在配置文件中,会把与程序系统功能相关的参数配置在环境变量中。

相关链接

https://github.com/caarlos0/env

《酷Go推荐》招募:

各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到

新的库,并且知道怎么用。

大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!戳「阅读原文」,即可报名

扫码也可以加入 GoCN 的大家族哟~

fc23f4bc6da2e451ed8c3aada7d9a18a.png

Go语言陷阱系列的视频来啦~戳下文即可观看~👇🏻👇🏻👇🏻


推荐阅读
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 本文详细解释了为什么在成功执行移动赋值操作后,对象的析构函数会被调用,并提供了代码示例和详细的分析。 ... [详细]
  • CentOS 6.8 上安装 Oracle 10.2.0.1 的常见问题及解决方案
    本文记录了在 CentOS 6.8 系统上安装 Oracle 10.2.0.1 数据库时遇到的问题及解决方法,包括依赖库缺失、操作系统版本不兼容、用户权限不足等问题。 ... [详细]
  • CentOS 7.6环境下Prometheus与Grafana的集成部署指南
    本文旨在提供一套详细的步骤,指导读者如何在CentOS 7.6操作系统上成功安装和配置Prometheus 2.17.1及Grafana 6.7.2-1,实现高效的数据监控与可视化。 ... [详细]
  • springMVC JRS303验证 ... [详细]
  • 本文深入探讨了 Delphi 中类对象成员的核心概念,包括 System 单元的基础知识、TObject 类的定义及其方法、TClass 的作用以及对象的消息处理机制。文章不仅解释了这些概念的基本原理,还提供了丰富的补充和专业解答,帮助读者全面理解 Delphi 的面向对象编程。 ... [详细]
  • 深入浅出TensorFlow数据读写机制
    本文详细介绍TensorFlow中的数据读写操作,包括TFRecord文件的创建与读取,以及数据集(dataset)的相关概念和使用方法。 ... [详细]
  • 本文探讨了如何使用pg-promise库在PostgreSQL中高效地批量插入多条记录,包括通过事务和单一查询两种方法。 ... [详细]
  • 本文详细介绍了Linux内核中misc设备驱动框架的实现原理及应用方法,包括misc设备的基本概念、驱动框架的初始化过程、数据结构分析以及设备的注册与注销流程。 ... [详细]
  • 本文详细介绍了如何解压并安装MySQL集群压缩包,创建用户和组,初始化数据库,配置环境变量,并启动相关服务。此外,还提供了详细的命令行操作步骤和常见问题的解决方案。 ... [详细]
  • 本文介绍了如何通过在数据库表中增加一个字段来记录文章的访问次数,并提供了一个示例方法用于更新该字段值。 ... [详细]
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
  • Logback使用小结
    1一定要使用slf4j的jar包,不要使用apachecommons的jar。否则滚动生成文件不生效,不滚动的时候却生效~~importorg.slf ... [详细]
  • 烤鸭|本文_Spring之Bean的生命周期详解
    烤鸭|本文_Spring之Bean的生命周期详解 ... [详细]
author-avatar
mobiledu2502853597
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有