从零封装Gin框架配置初始化全局变量
作者:生活处处有BUG
引言
配置文件是每个项目必不可少的部分,用来保存应用基本数据、数据库配置等信息,避免要修改一个配置项需要到处找的尴尬。这里我使用 viper 作为配置管理方案,它支持 JSON、TOML、YAML、HCL、envfile、Java properties 等多种格式的配置文件,并且能够监听配置文件的修改,进行热重载,详细介绍大家可以去官方文档查看
安装
go get -u github.com/spf13/viper
编写配置文件
在项目根目录下新建一个文件 config.yaml
,初期先将项目的基本配置放入,后续我们会添加更多配置信息
app: # 应用基本配置 env: local # 环境名称 port: 8888 # 服务监听端口号 app_name: gin-app # 应用名称 app_url: http://localhost # 应用域名
编写配置结构体
在项目根目录下新建文件夹 config
,用于存放所有配置对应的结构体
新建 config.go
文件,定义 Configuration
结构体,其 App
属性对应 config.yaml
中的 app
package config type Configuration struct { App App `mapstructure:"app" json:"app" yaml:"app"` }
新建 app.go
文件,定义 App
结构体,其所有属性分别对应 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"` }
注意:配置结构体中 mapstructure
标签需对应 config.ymal
中的配置名称, viper
会根据标签 value 值把 config.yaml
的数据赋予给结构体
全局变量
新建 global/app.go
文件,定义 Application
结构体,用来存放一些项目启动时的变量,便于调用,目前先将 viper
结构体和 Configuration
结构体放入,后续会添加其他成员属性
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" // 生产环境可以通过设置环境变量来改变配置文件路径 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)) } // 监听配置文件 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) }
执行 go run main.go
,启动应用,服务器监听的端口是已经是配置文件里的端口号了,http://127.0.0.1:8888/ping
以上就是从零封装Gin框架配置初始化全局变量的详细内容,更多关于封装Gin初始化全局变量的资料请关注脚本之家其它相关文章!