欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

讀取Go項目中的配置文件的方法

 更新時間:2022年06月17日 15:05:11   作者:范閑  
本文主要介紹了讀取Go項目中的配置文件的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

Go語言提供了很簡便的讀取json和yaml文件的api,我們可以很輕松將一個json或者yaml文件轉(zhuǎn)換成Go的結(jié)構(gòu)體,但是如果直接在項目中讀取配置文件,這種方式并不夠好。缺點如下:

實際開發(fā)中配置項在不同環(huán)境下,配置的值是不同的

上面的問題可以通過不同的配置文件去決定在那個環(huán)境讀取那個配置文件,但是還有一個問題就是實際開發(fā)中,配置項有些是相同的,有些是不同的,如果配置文件有一個主配置文件,里面存放的是不同環(huán)境相同的配置項,還有一個跟隨環(huán)境的配置文件,里面存放的是不同環(huán)境的配置項,然后讀取兩個配置文件后,做一個merge,這樣得到的結(jié)果就是總共的配置項信息。

有些配置項是必填的,有些配置項的值是一些特殊的值,比如,郵箱,手機號,IP信息等

來看看gonfig是怎么解決這個問題的

  • 安裝gonfig
go get github.com/xiao-ren-wu/gonfig
  • 項目中新建配置目錄,并編寫對應(yīng)配置文件,在配置目錄同級目錄添加讀取配置文件的go文件

conf.yaml文件中存放的是通用的配置,conf-{{active}}.yaml中存放不同環(huán)境不同的配置信息。

conf
   |-conf.yaml
   |-conf-dev.yaml
   |-conf-prod.yaml
   |config.go
  • 利用go:embed將配置文件載入到內(nèi)存,調(diào)用gonfig.Unmarshal讀取配置文件
package config

import (
   "model"
   "github.com/xiao-ren-wu/gonfig"
   "embed"
)

//go:embed *.yaml
var confDir embed.FS

// 我們配置文件的配置struct
type AppConf struct {
	AppName string `yaml:"app-name" json:"app-name"`
	DB      DBConf `yaml:"db" json:"db"`
}

type DBConf struct {
	Username string `yaml:"username" json:"username"`
	Password string `yaml:"password" json:"password"`
}

var conf Conf

func Init() {
   if err := gonfig.Unmarshal(confDir, &conf); err != nil {
      panic(err)
   }
}

func GetConf() *Conf {
   return &conf
}

這樣就完成了項目中配置文件的讀取,是不是很簡單? 此時讀到的配置形式是conf-{{profile}}.yamlconf.yaml的總和,如果conf-{{profile}}.yaml中定義的屬性和conf.yaml相同,那么會以conf-{{profile}}.yaml為準

約定

gonfigAPI的簡潔性的原因是因為背后做了很多約束,只有符合約束的配置才能被成功讀取,具體的約束條件如下:

  • gonfig.Unmarshal會默認讀取文件名稱有前綴conf的文件

  • 通過環(huán)境變量profile作為環(huán)境名稱,如果沒有配置,默認dev。

  • 程序會尋找conf.yaml作為主配置文件,conf-{{profile}}.yaml作為環(huán)境特有配置文件,然后對文件內(nèi)容進行合并

  • 如果conf-{{profile}}.yaml中的屬性和conf.yaml中屬性都有定義,那么會以conf-{{profile}}.yaml為準。

根據(jù)項目定制化配置文件

gonfig.Unmarshal的函數(shù)簽名func Unmarshal(confDir ReadFileDir, v interface{}, ops ...Option) error 提供很多配置項,供用戶定制化需求,具體的配置信息如下:

  • 更改配置文件名稱前綴FilePrefix(prefix string)

  • 更改讀取配置文件類型UnmarshalWith(uType UnmarshalType)

  • 更改讀取的環(huán)境變量名稱ProfileUseEnv(envName, defaultProfile string)

  • 自定義設(shè)置profileProfileFunc(f func() string)

原理篇

gonfig的實現(xiàn)也很簡單,核心的源碼如下:

func Unmarshal(confDir ReadFileDir, v interface{}, ops ...Option) error {
	if v != nil && reflect.ValueOf(v).Kind() != reflect.Ptr {
		return gonfig_error.ErrNonPointerArgument
	}

	var cs = &confStruct{
		confPrefix:      "conf",
		envName:         "profile",
		defaultEnvValue: "dev",
		unmarshalType:   Yaml,
	}
	cs.activeProfileFunc = func() string {
		return getActiveProfile(cs.envName, cs.defaultEnvValue)
	}

	for _, op := range ops {
		op(cs)
	}

	cs.profileActive = cs.activeProfileFunc()

	if err := loadConf(confDir, cs); err != nil {
		return err
	}

	// copy val
	v1 := reflect.New(reflect.TypeOf(v).Elem()).Interface()

	if err := fileUnmarshal(cs.activeConfRaw, v1, cs.unmarshalType); err != nil {
		return err
	}

	if len(cs.masterConfRaw) == 0 {
		return gonfig_error.MasterProfileConfNotSetError
	}

	if err := fileUnmarshal(cs.masterConfRaw, v, cs.unmarshalType); err != nil {
		return err
	}

	return mergo.Merge(v, v1, mergo.WithOverride)
}

大概的原理就是復(fù)制了一份用戶傳給函數(shù)的結(jié)構(gòu)體v1,結(jié)構(gòu)體v1和v分別用于接收conf-{{profile}}.yaml中的屬性和conf.yaml的配置信息,然后通過調(diào)用三方開源庫mergo對兩個結(jié)構(gòu)體的屬性做一個merge。

這就是關(guān)于gonfig的全部內(nèi)容啦~~~

github地址是:https://github.com/xiao-ren-wu/gonfig

到此這篇關(guān)于讀取Go項目中的配置文件的方法的文章就介紹到這了,更多相關(guān)Go讀取配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go?Redis客戶端使用的兩種對比

    Go?Redis客戶端使用的兩種對比

    這篇文章主要為大家介紹了Go?Redis客戶端使用對比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Go中使用gjson來操作JSON數(shù)據(jù)的實現(xiàn)

    Go中使用gjson來操作JSON數(shù)據(jù)的實現(xiàn)

    本文主要介紹了Go中使用gjson來操作JSON數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Go?實現(xiàn)?WebSockets之創(chuàng)建?WebSockets

    Go?實現(xiàn)?WebSockets之創(chuàng)建?WebSockets

    這篇文章主要介紹了Go?實現(xiàn)?WebSockets之創(chuàng)建?WebSockets,文章主要探索?WebSockets,并簡要介紹了它們的工作原理,并仔細研究了全雙工通信,想了解更多相關(guān)內(nèi)容的小伙伴可以參考一下
    2022-04-04
  • Go項目編寫Makefile規(guī)則文件概述

    Go項目編寫Makefile規(guī)則文件概述

    這篇文章主要為大家介紹了Go項目編寫Makefile文件規(guī)則概述,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Golang官方限流器庫實現(xiàn)限流示例詳解

    Golang官方限流器庫實現(xiàn)限流示例詳解

    這篇文章主要為大家介紹了Golang官方限流器庫使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Go字典使用詳解

    Go字典使用詳解

    今天和大家一起學習Go語言的字典。Go語言的字典又稱為map,一種使用廣泛的數(shù)據(jù)結(jié)構(gòu)。它是擁有key/value對元素的「無序集合」,而且在集合中key必須是唯一的
    2022-11-11
  • golang生成JSON以及解析JSON

    golang生成JSON以及解析JSON

    這篇文章主要介紹了golang生成JSON以及解析JSON,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Golang定時器的2種實現(xiàn)方法與區(qū)別

    Golang定時器的2種實現(xiàn)方法與區(qū)別

    這篇文章主要給大家介紹了關(guān)于Golang定時器的2種實現(xiàn)方法與區(qū)別的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • go語言操作es的實現(xiàn)示例

    go語言操作es的實現(xiàn)示例

    本文主要介紹了go語言操作es的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • go使用makefile腳本編譯應(yīng)用的方法小結(jié)

    go使用makefile腳本編譯應(yīng)用的方法小結(jié)

    makefile可以看作是make工具的腳本文件, 而make主要用來處理一系列命令。常用的比如用來編譯和打包文件, 在C/C++的編譯打包中應(yīng)用最廣泛了,這篇文章主要介紹了go使用makefile腳本編譯應(yīng)用,需要的朋友可以參考下
    2022-08-08

最新評論