golang读取环境变量(envconfig包的使用)

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 string
	GuanYu string
	ZhangFei string
	Zhangfei string
	ZHANGFEI string
}


func main() {
	var s XiShuList
	err := 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 ShuList

	err := 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 XiShuList
	err := 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 XiShuList
	err := 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 XiShuList
	err := 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 XiShuList
	err := 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 XiShuList
	err := envconfig.Process("crow", &s)
	if err != nil {
		log.Fatal(err.Error())
	}
	fmt.Println("LiuBei name: ",s.LiuBei)

}
  • 打印结果

虽然刘备接收到了变量值,但依然没有值。

LiuBei name: 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄德公笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值