從零封裝Gin框架配置初始化全局變量
引言
配置文件是每個(gè)項(xiàng)目必不可少的部分,用來(lái)保存應(yīng)用基本數(shù)據(jù)、數(shù)據(jù)庫(kù)配置等信息,避免要修改一個(gè)配置項(xiàng)需要到處找的尷尬。這里我使用 viper 作為配置管理方案,它支持 JSON、TOML、YAML、HCL、envfile、Java properties 等多種格式的配置文件,并且能夠監(jiān)聽(tīng)配置文件的修改,進(jìn)行熱重載,詳細(xì)介紹大家可以去官方文檔查看
安裝
go get -u github.com/spf13/viper
編寫(xiě)配置文件
在項(xiàng)目根目錄下新建一個(gè)文件 config.yaml
,初期先將項(xiàng)目的基本配置放入,后續(xù)我們會(huì)添加更多配置信息
app: # 應(yīng)用基本配置 env: local # 環(huán)境名稱(chēng) port: 8888 # 服務(wù)監(jiān)聽(tīng)端口號(hào) app_name: gin-app # 應(yīng)用名稱(chēng) app_url: http://localhost # 應(yīng)用域名
編寫(xiě)配置結(jié)構(gòu)體
在項(xiàng)目根目錄下新建文件夾 config
,用于存放所有配置對(duì)應(yīng)的結(jié)構(gòu)體
新建 config.go
文件,定義 Configuration
結(jié)構(gòu)體,其 App
屬性對(duì)應(yīng) config.yaml
中的 app
package config type Configuration struct { App App `mapstructure:"app" json:"app" yaml:"app"` }
新建 app.go
文件,定義 App
結(jié)構(gòu)體,其所有屬性分別對(duì)應(yīng) config.yaml
中 app
下的所有配置
package config type App struct { Env string `mapstructure:"env" json:"env" yaml:"env"` Port string `mapstructure:"port" json:"port" yaml:"port"` AppName string `mapstructure:"app_name" json:"app_name" yaml:"app_name"` AppUrl string `mapstructure:"app_url" json:"app_url" yaml:"app_url"` }
注意:配置結(jié)構(gòu)體中 mapstructure
標(biāo)簽需對(duì)應(yīng) config.ymal
中的配置名稱(chēng), viper
會(huì)根據(jù)標(biāo)簽 value 值把 config.yaml
的數(shù)據(jù)賦予給結(jié)構(gòu)體
全局變量
新建 global/app.go
文件,定義 Application
結(jié)構(gòu)體,用來(lái)存放一些項(xiàng)目啟動(dòng)時(shí)的變量,便于調(diào)用,目前先將 viper
結(jié)構(gòu)體和 Configuration
結(jié)構(gòu)體放入,后續(xù)會(huì)添加其他成員屬性
package global import ( "github.com/spf13/viper" "jassue-gin/config" ) type Application struct { ConfigViper *viper.Viper Config config.Configuration } var App = new(Application)
使用 viper 載入配置
新建 bootstrap/config.go
文件,編寫(xiě)代碼:
package bootstrap import ( "fmt" "github.com/fsnotify/fsnotify" "github.com/spf13/viper" "jassue-gin/global" "os" ) func InitializeConfig() *viper.Viper { // 設(shè)置配置文件路徑 config := "config.yaml" // 生產(chǎn)環(huán)境可以通過(guò)設(shè)置環(huán)境變量來(lái)改變配置文件路徑 if configEnv := os.Getenv("VIPER_CONFIG"); configEnv != "" { config = configEnv } // 初始化 viper v := viper.New() v.SetConfigFile(config) v.SetConfigType("yaml") if err := v.ReadInConfig(); err != nil { panic(fmt.Errorf("read config failed: %s \n", err)) } // 監(jiān)聽(tīng)配置文件 v.WatchConfig() v.OnConfigChange(func(in fsnotify.Event) { fmt.Println("config file changed:", in.Name) // 重載配置 if err := v.Unmarshal(&global.App.Config); err != nil { fmt.Println(err) } }) // 將配置賦值給全局變量 if err := v.Unmarshal(&global.App.Config); err != nil { fmt.Println(err) } return v }
初始化配置
修改 main.go
文件
package main import ( "github.com/gin-gonic/gin" "jassue-gin/bootstrap" "jassue-gin/global" "net/http" ) func main() { // 初始化配置 bootstrap.InitializeConfig() r := gin.Default() // 測(cè)試路由 r.GET("/ping", func(c *gin.Context) { c.String(http.StatusOK, "pong") }) // 啟動(dòng)服務(wù)器 r.Run(":" + global.App.Config.App.Port) }
執(zhí)行 go run main.go
,啟動(dòng)應(yīng)用,服務(wù)器監(jiān)聽(tīng)的端口是已經(jīng)是配置文件里的端口號(hào)了,http://127.0.0.1:8888/ping
以上就是從零封裝Gin框架配置初始化全局變量的詳細(xì)內(nèi)容,更多關(guān)于封裝Gin初始化全局變量的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語(yǔ)言實(shí)現(xiàn)切片增刪改查的示例代碼
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中切片的使用(增刪改查),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下2022-04-04Golang Gin框架實(shí)現(xiàn)多種數(shù)據(jù)格式返回結(jié)果詳解
這篇文章主要介紹了Golang Gin框架實(shí)現(xiàn)多種數(shù)據(jù)格式返回結(jié)果,我們都知道,一個(gè)完整的請(qǐng)求包含請(qǐng)求和處理請(qǐng)求以及結(jié)果返回三個(gè)步驟,在服務(wù)器端對(duì)請(qǐng)求處理完成以后,會(huì)將結(jié)果返回給客戶端,在gin框架中,支持返回多種請(qǐng)求數(shù)據(jù)格式,下面我們一起來(lái)看看2023-05-05golang實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)事務(wù)的提交與回滾
這篇文章主要介紹了golang實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)事務(wù)的提交與回滾,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04GO語(yǔ)言中Chan實(shí)現(xiàn)原理的示例詳解
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中Chan實(shí)現(xiàn)原理的相關(guān)資料,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下2023-02-02GO語(yǔ)言并發(fā)編程之互斥鎖、讀寫(xiě)鎖詳解
這篇文章主要介紹了GO語(yǔ)言并發(fā)編程之互斥鎖、讀寫(xiě)鎖詳解,本文是GO并發(fā)編程實(shí)戰(zhàn)一書(shū)的樣章,詳細(xì)講解了互斥鎖、讀寫(xiě)鎖,然后給出了一個(gè)完整示例,需要的朋友可以參考下2014-11-11