從零封裝Gin框架配置初始化全局變量
引言
配置文件是每個(gè)項(xiàng)目必不可少的部分,用來保存應(yīng)用基本數(shù)據(jù)、數(shù)據(jù)庫配置等信息,避免要修改一個(gè)配置項(xiàng)需要到處找的尷尬。這里我使用 viper 作為配置管理方案,它支持 JSON、TOML、YAML、HCL、envfile、Java properties 等多種格式的配置文件,并且能夠監(jiān)聽配置文件的修改,進(jìn)行熱重載,詳細(xì)介紹大家可以去官方文檔查看
安裝
go get -u github.com/spf13/viper
編寫配置文件
在項(xiàng)目根目錄下新建一個(gè)文件 config.yaml
,初期先將項(xiàng)目的基本配置放入,后續(xù)我們會(huì)添加更多配置信息
app: # 應(yīng)用基本配置 env: local # 環(huán)境名稱 port: 8888 # 服務(wù)監(jiān)聽端口號 app_name: gin-app # 應(yīng)用名稱 app_url: http://localhost # 應(yīng)用域名
編寫配置結(jié)構(gòu)體
在項(xiàng)目根目錄下新建文件夾 config
,用于存放所有配置對應(yīng)的結(jié)構(gòu)體
新建 config.go
文件,定義 Configuration
結(jié)構(gòu)體,其 App
屬性對應(yīng) config.yaml
中的 app
package config type Configuration struct { App App `mapstructure:"app" json:"app" yaml:"app"` }
新建 app.go
文件,定義 App
結(jié)構(gòu)體,其所有屬性分別對應(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)簽需對應(yīng) config.ymal
中的配置名稱, viper
會(huì)根據(jù)標(biāo)簽 value 值把 config.yaml
的數(shù)據(jù)賦予給結(jié)構(gòu)體
全局變量
新建 global/app.go
文件,定義 Application
結(jié)構(gòu)體,用來存放一些項(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
文件,編寫代碼:
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)境可以通過設(shè)置環(huán)境變量來改變配置文件路徑 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)聽配置文件 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() // 測試路由 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)聽的端口是已經(jīng)是配置文件里的端口號了,http://127.0.0.1:8888/ping
以上就是從零封裝Gin框架配置初始化全局變量的詳細(xì)內(nèi)容,更多關(guān)于封裝Gin初始化全局變量的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang Gin框架實(shí)現(xiàn)多種數(shù)據(jù)格式返回結(jié)果詳解
這篇文章主要介紹了Golang Gin框架實(shí)現(xiàn)多種數(shù)據(jù)格式返回結(jié)果,我們都知道,一個(gè)完整的請求包含請求和處理請求以及結(jié)果返回三個(gè)步驟,在服務(wù)器端對請求處理完成以后,會(huì)將結(jié)果返回給客戶端,在gin框架中,支持返回多種請求數(shù)據(jù)格式,下面我們一起來看看2023-05-05golang實(shí)現(xiàn)mysql數(shù)據(jù)庫事務(wù)的提交與回滾
這篇文章主要介紹了golang實(shí)現(xiàn)mysql數(shù)據(jù)庫事務(wù)的提交與回滾,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04