golang读取环境变量(envconfig包的使用)
文章目录
- 1. 基本使用
-
- 1.1 使用方法
- 1.2 示例 (简单使用)
- 1.3 示例 (环境变量中的数组/切片)
- 2. 结构体 tag 支持
-
- 2.1 split_words
-
- 说明
- 示例
- 2.2 envconfig
-
- 说明
- 示例
- 2.3 default
-
- 说明
- 示例
- 2.4 required
-
- 说明
- 示例
- 2.5 ignored
-
- 说明
- 示例
1. 基本使用
1.1 使用方法
- 1)定义变量
前缀_变量名=值
- 2)定义结构体
结构体成员名和变量名对应,但结构体成员名不区分大小写(我们在示例1中可以看到)
type 结构体名 struct {成员名1(和变量名对应) 类型成员名2(和变量名对应) 类型成员名3(和变量名对应) 类型}
- 3)接收
func Process(prefix string, spec interface{}) error
示例
err := envconfig.Process( 刚才定义的前缀名, 接收的结构体指针)
- 使用
接收的时候已经给结构体赋值了,我们直接使用成员值即可。
1.2 示例 (简单使用)
- 定义结环境变量(以linux为例)
export CROW_LIUBEI="刘备"export CROW_GUANYU="关羽"export CROW_ZHANGFEI="张飞"
- 代码
type XiShuList struct {LiuBei stringGuanYu stringZhangFei stringZhangfei stringZHANGFEI string}func main() {var s XiShuListerr := envconfig.Process("crow", &s)if err != nil {log.Fatal(err.Error())}//println(os.Getenv("CROW_LIU_BEI"))fmt.Println("name1: ",s.LiuBei)fmt.Println("name2: ", s.GuanYu)fmt.Println("name3-1: ",s.ZhangFei)fmt.Println("name3-2: ",s.Zhangfei)fmt.Println("name3-3: ",s.ZHANGFEI)}
- 输出
输出可以看到,不管我们怎么定义结构体成员(不区分大小写),都会输出“张飞”
name1: 刘备name2: 关羽name3-1: 张飞name3-2: 张飞name3-3: 张飞
1.3 示例 (环境变量中的数组/切片)
- 定义环境变量
export CROW_SHUNAMES="刘备,关羽,张飞"
- 代码
type ShuList struct {ShuNames []string}func main() {var nameList ShuListerr := envconfig.Process("crow", &nameList)if err != nil {log.Fatal(err.Error())}for _,name := range nameList.ShuNames{fmt.Println(name)}}
- 输出
刘备关羽张飞
2. 结构体 tag 支持
2.1 split_words
说明
如果结构体成员有标签 split_words:"true"
,比如LiuBei 它会寻找变量 前缀_LIU_BEI
而此前的示例中没有这个标签,它会去找 前缀_LIUBEI
示例
之前我们没有使用这个标签,所以定义结构体的时候不区分大小写。
但是使用之后,就只有驼峰可以使用了
- 环境变量
export CROW_LIU_BEI="刘备"
- 代码
我们写个三个成员接收,看谁可以接收到。
type XiShuList struct {LiuBei string `split_words:"true"`Liubei string `split_words:"true"`LIUBEI string `split_words:"true"`}func main() {var s XiShuListerr := envconfig.Process("crow", &s)if err != nil {log.Fatal(err.Error())}fmt.Println("name1: ",s.LiuBei)fmt.Println("name2: ", s.Liubei)fmt.Println("name3: ",s.LIUBEI)}
- 输出
如下可见,只有驼峰定义的结构体成员接收到了变量
name1: 刘备name2: name3:
2.2 envconfig
说明
自定义指向一个不相关的环境变量
示例
- 定义变量
export CROW_LIU_BEI="刘备"export CROW_GUAN_YU="关羽"
- 代码
将结构体成员
LiuBei
指向 变量关羽
type XiShuList struct {LiuBei string `envconfig:"guan_yu"`}func main() {var s XiShuListerr := envconfig.Process("crow", &s)if err != nil {log.Fatal(err.Error())}fmt.Println("LiuBei name: ",s.LiuBei)}
- 打印结果
LiuBei name: 关羽
2.3 default
说明
结构体成员默认值,没有接收到变量值的时候生效。
示例
定义结构体,包含两个成员 刘备、于吉,都设置默认值为“遁甲”,且刘备可以接收到变量值,于吉不能。
我们猜想,刘备的名字应该正确输出,而于吉将输出“遁甲”
- 定义变量
只定义刘备,不定义于吉。
export CROW_LIU_BEI="刘备"
- 代码
刘备和于吉的默认值都设置“遁甲”
type XiShuList struct {LiuBei string `default:"遁甲" split_words:"true"`YuJi string `default:"遁甲" split_words:"true"`}func main() {var s XiShuListerr := envconfig.Process("crow", &s)if err != nil {log.Fatal(err.Error())}fmt.Println("LiuBei name: ",s.LiuBei)fmt.Println("YuJi name: ",s.YuJi)}
- 输出
LiuBei name: 刘备YuJi name: 遁甲
2.4 required
说明
如果没有定义该变量则报错。
如果定义了,哪怕是空值也不会报错。
示例
-
定义变量
此处我们不定义于吉的变量。 -
代码
type XiShuList struct {YuJi string `required:"true" split_words:"true"`}func main() {var s XiShuListerr := envconfig.Process("crow", &s)if err != nil {log.Fatal(err.Error())}fmt.Println("LiuBei name: ",s.LiuBei)fmt.Println("YuJi name: ",s.YuJi)}
- 结果输出
2022/05/11 18:59:34 required key CROW_YU_JI missing value
2.5 ignored
说明
结构体中成员即使接收到了变量值,该值也会被忽略
示例
- 定义变量
export CROW_LIU_BEI="刘备"
- 代码
type XiShuList struct {LiuBei string `ignored:"true"`}func main() {var s XiShuListerr := envconfig.Process("crow", &s)if err != nil {log.Fatal(err.Error())}fmt.Println("LiuBei name: ",s.LiuBei)}
- 打印结果
虽然刘备接收到了变量值,但依然没有值。
LiuBei name: