<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          「GoCN酷Go推薦」env 環(huán)境變量獲取庫

          共 1767字,需瀏覽 4分鐘

           ·

          2021-11-30 17:13


          背景

          對于編譯成二進(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語言陷阱系列的視頻來啦~戳下文即可觀看~????????????


          瀏覽 84
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲综合免费观看高清完整版在线观 | 操逼 18岁 | 黄色小视频在线看 | 欧美日逼视频 | 亚洲欧美最大色情网站 |