從零封裝Gin框架配置初始化全局變量
引言
配置文件是每個項目必不可少的部分,用來保存應用基本數(shù)據(jù)、數(shù)據(jù)庫配置等信息,避免要修改一個配置項需要到處找的尷尬。這里我使用 viper 作為配置管理方案,它支持 JSON、TOML、YAML、HCL、envfile、Java properties 等多種格式的配置文件,并且能夠監(jiān)聽配置文件的修改,進行熱重載,詳細介紹大家可以去官方文檔查看
安裝
go get -u github.com/spf13/viper
編寫配置文件
在項目根目錄下新建一個文件 config.yaml ,初期先將項目的基本配置放入,后續(xù)我們會添加更多配置信息
app: # 應用基本配置 env: local # 環(huán)境名稱 port: 8888 # 服務監(jiān)聽端口號 app_name: gin-app # 應用名稱 app_url: http://localhost # 應用域名
編寫配置結(jié)構(gòu)體
在項目根目錄下新建文件夾 config,用于存放所有配置對應的結(jié)構(gòu)體
新建 config.go 文件,定義 Configuration 結(jié)構(gòu)體,其 App 屬性對應 config.yaml 中的 app
package config
type Configuration struct {
App App `mapstructure:"app" json:"app" yaml:"app"`
}新建 app.go 文件,定義 App 結(jié)構(gòu)體,其所有屬性分別對應 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 標簽需對應 config.ymal 中的配置名稱, viper 會根據(jù)標簽 value 值把 config.yaml 的數(shù)據(jù)賦予給結(jié)構(gòu)體
全局變量
新建 global/app.go 文件,定義 Application 結(jié)構(gòu)體,用來存放一些項目啟動時的變量,便于調(diào)用,目前先將 viper 結(jié)構(gòu)體和 Configuration 結(jié)構(gòu)體放入,后續(xù)會添加其他成員屬性
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 {
// 設置配置文件路徑
config := "config.yaml"
// 生產(chǎn)環(huán)境可以通過設置環(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")
})
// 啟動服務器
r.Run(":" + global.App.Config.App.Port)
}執(zhí)行 go run main.go ,啟動應用,服務器監(jiān)聽的端口是已經(jīng)是配置文件里的端口號了,http://127.0.0.1:8888/ping
以上就是從零封裝Gin框架配置初始化全局變量的詳細內(nèi)容,更多關于封裝Gin初始化全局變量的資料請關注腳本之家其它相關文章!
相關文章
GO語言協(xié)程創(chuàng)建使用并通過channel解決資源競爭
這篇文章主要為大家介紹了GO語言協(xié)程創(chuàng)建使用并通過channel解決資源競爭,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-04-04
Golang科學計數(shù)法轉(zhuǎn)換string數(shù)字輸出的實現(xiàn)
最近接手一個商城運單號模塊,接手后發(fā)現(xiàn)有部分運單號返回給前端是按照科學計數(shù)法的方式返回,本文就介紹一下Golang科學計數(shù)法轉(zhuǎn)換string數(shù)字輸出,感興趣的可以了解一下2021-07-07
基于GORM實現(xiàn)CreateOrUpdate方法詳解
這篇文章主要為大家介紹了基于GORM實現(xiàn)CreateOrUpdate方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10

