从零封装Gin框架配置初始化全局变量

 更新时间:2024年01月31日 10:41:13   作者:生活处处有BUG  
这篇文章主要为大家介绍了从零封装Gin框架配置初始化全局变量,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

配置文件是每个项目必不可少的部分,用来保存应用基本数据、数据库配置等信息,避免要修改一个配置项需要到处找的尴尬。这里我使用 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初始化全局变量的资料请关注脚本之家其它相关文章!

相关文章

  • Golang并发读取文件数据并写入数据库的项目实践

    Golang并发读取文件数据并写入数据库的项目实践

    本文主要介绍了Golang并发读取文件数据并写入数据库的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Go语言实现的一个简单Web服务器

    Go语言实现的一个简单Web服务器

    这篇文章主要介绍了Go语言实现的一个简单Web服务器,本文先是给出一个使用http包建立的Web服务器源码,并对比了其它编程语言,需要的朋友可以参考下
    2014-10-10
  • Go语言ORM包中使用worm构造查询条件的实例详解

    Go语言ORM包中使用worm构造查询条件的实例详解

    worm是一款方便易用的Go语言ORM库。worm支Model方式(持结构体字段映射)、原生SQL以及SQLBuilder三种模式来操作数据库,并且Model方式、原生SQL以及SQLBuilder可混合使用,本文通过一些例子来说明如何使用worm来构造查询条件,感兴趣的朋友一起看看吧
    2022-07-07
  • Goland IDEA项目多开设置方式

    Goland IDEA项目多开设置方式

    这篇文章主要介绍了Goland IDEA项目多开设置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • GPT回答:go语言和C语言切片对比

    GPT回答:go语言和C语言切片对比

    这篇文章主要为大家介绍了GPT回答:go语言和C语言切片对比,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • GoFrame gtree树形结构的使用技巧示例

    GoFrame gtree树形结构的使用技巧示例

    这篇文章主要为大家介绍了GoFrame gtree树形结构的使用技巧示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go调用链可视化工具使用实例探究

    Go调用链可视化工具使用实例探究

    本文介绍一款工具 go-callvis,它能够将 Go 代码的调用关系可视化出来,并提供了可交互式的 web 服务,在接手他人代码或调研一些开源项目时,如果能够理清其中的代码调用链路,这将加速我们对实现的理解
    2024-01-01
  • Go基础教程系列之回调函数和闭包详解

    Go基础教程系列之回调函数和闭包详解

    这篇文章主要介绍了Go基础教程系列之回调函数和闭包详解,需要的朋友可以参考下
    2022-04-04
  • go语言题解LeetCode1275找出井字棋的获胜者示例

    go语言题解LeetCode1275找出井字棋的获胜者示例

    这篇文章主要为大家介绍了go语言题解LeetCode1275找出井字棋的获胜者示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 一文带你熟悉Go语言中的for循环

    一文带你熟悉Go语言中的for循环

    这篇文章主要和大家分享一下Go语言中for循环的定义与使用,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考一下
    2022-11-11

最新评论