「GoCN酷Go推薦」env 環(huán)境變量獲取庫
背景
對于編譯成二進(jìn)制文件的程序而言,其本身就是一個黑盒子。程序的外部控制主要由三個部分組成:命令行參數(shù),配置文件和環(huán)境變量。之前的文章中,我們已經(jīng)擁有命令行參數(shù)工具庫cobra,配置文件讀取庫viper,今天我們來了解一下在環(huán)境變量讀取庫中的一員env。
安裝
????go?get?github.com/caarlos0/env/v6
使用案例
package?main
import?(
?"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逐一進(jìn)行分析:
- env:環(huán)境變量的獲取名。
- unset:與env逗號隔開,表明環(huán)境變量值獲取之后即刻清理,通常用于私密數(shù)據(jù)。
- file:將對應(yīng)文件內(nèi)容讀取賦值。
- required: 畢竟從環(huán)境變量中讀取到。
- notEmpty: 非空
- envDefault:顧名思義,當(dāng)獲取不到環(huán)境變量值時的默認(rèn)值。
- envSeparator: 當(dāng)變量是字符串?dāng)?shù)組時,此值對應(yīng)切分時使用的字符。
- envExpand:通常與envDefault配合使用,允許使用環(huán)境變量對envDefault的值格式化。
擴(kuò)展
env庫的公開函數(shù)中,使用ParseWithFuncs可以傳入自定義的類型解析函數(shù),其類型為map[reflect.Type]func(v string) (interface{}, error)。如此通過形如type Myint int的方式,讓解析過程能擁有更大的靈活性。
源碼悄悄看
env庫的主要功能源碼不過500行,其中使用了大量reflect庫的反射機(jī)制,用于對環(huán)境變量值到結(jié)構(gòu)體成員類型的轉(zhuǎn)換,defaultBuiltInParsers定義了其默認(rèn)的類型解析函數(shù)。解析流程:
- 通過os.Environ()獲得環(huán)境變量字符串key=value形式,轉(zhuǎn)換成map[string]string結(jié)構(gòu)。
- 通過反射循環(huán)獲取結(jié)構(gòu)體變量信息,包括變量類型和對應(yīng)tag
- 使用設(shè)定對應(yīng)的解析函數(shù),其中若是結(jié)構(gòu)體則遞歸調(diào)用
- 根據(jù)tag指定的邏輯對解析后的值進(jìn)行判斷和處理
- 對結(jié)構(gòu)體變量賦值
總結(jié)
環(huán)境變量在程序中的使用隨著微服務(wù)項(xiàng)目的普及而越來越常見。環(huán)境變量可以看作是操作系統(tǒng)層面的配置文件,因此我們通常會把與業(yè)務(wù)相關(guān)的參數(shù)寫在配置文件中,會把與程序系統(tǒng)功能相關(guān)的參數(shù)配置在環(huán)境變量中。
相關(guān)鏈接
https://github.com/caarlos0/env
《酷Go推薦》招募:
各位Gopher同學(xué),最近我們社區(qū)打算推出一個類似GoCN每日新聞的新欄目《酷Go推薦》,主要是每周推薦一個庫或者好的項(xiàng)目,然后寫一點(diǎn)這個庫使用方法或者優(yōu)點(diǎn)之類的,這樣可以真正的幫助到大家能夠?qū)W習(xí)到
新的庫,并且知道怎么用。
大概規(guī)則和每日新聞類似,如果報(bào)名人多的話每個人一個月輪到一次,歡迎大家報(bào)名!戳「閱讀原文」,即可報(bào)名
掃碼也可以加入 GoCN 的大家族喲~
Go語言陷阱系列的視頻來啦~戳下文即可觀看~????????????
