1. 基本使用
1.1 使用方法
结构体成员名和变量名对应,但结构体成员名不区分大小写(我们在示例1中可以看到)
| type 结构体名 struct { |
| 成员名1(和变量名对应) 类型 |
| 成员名2(和变量名对应) 类型 |
| 成员名3(和变量名对应) 类型 |
| } |
| func Process(prefix string, spec interface{}) error |
示例
| err := envconfig.Process( 刚才定义的前缀名, 接收的结构体指针) |
接收的时候已经给结构体赋值了,我们直接使用成员值即可。
1.2 示例 (简单使用)
| 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()) |
| } |
| |
| 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
示例
之前我们没有使用这个标签,所以定义结构体的时候不区分大小写。
但是使用之后,就只有驼峰可以使用了
我们写个三个成员接收,看谁可以接收到。
| 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) |
| } |
如下可见,只有驼峰定义的结构体成员接收到了变量
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) |
| } |
2.3 default
说明
结构体成员默认值,没有接收到变量值的时候生效。
示例
定义结构体,包含两个成员 刘备、于吉,都设置默认值为“遁甲”,且刘备可以接收到变量值,于吉不能。
我们猜想,刘备的名字应该正确输出,而于吉将输出“遁甲”
只定义刘备,不定义于吉。
刘备和于吉的默认值都设置“遁甲”
| 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
说明
结构体中成员即使接收到了变量值,该值也会被忽略
示例
| |
| 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) |
| |
| } |
虽然刘备接收到了变量值,但依然没有值。

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了