欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

從零封裝Gin框架配置初始化全局變量

 更新時(shí)間:2024年01月31日 10:41:13   作者:生活處處有BUG  
這篇文章主要為大家介紹了從零封裝Gin框架配置初始化全局變量,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

配置文件是每個(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)切片增刪改查的示例代碼

    Go語(yǔ)言實(shí)現(xiàn)切片增刪改查的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中切片的使用(增刪改查),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下
    2022-04-04
  • Go 字符串格式化的實(shí)例代碼詳解

    Go 字符串格式化的實(shí)例代碼詳解

    這篇文章主要介紹了Go 字符串格式化的實(shí)例代碼詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • golang套接字的實(shí)現(xiàn)

    golang套接字的實(shí)現(xiàn)

    Go語(yǔ)言中通過(guò)標(biāo)準(zhǔn)庫(kù)net實(shí)現(xiàn)套接字編程,涵蓋了TCP和UDP兩種網(wǎng)絡(luò)類(lèi)型,通過(guò)這些基本概念和實(shí)際代碼示例,可以幫助理解和掌握Go語(yǔ)言中的套接字編程
    2024-10-10
  • Golang 刪除文件并遞歸刪除空目錄的操作

    Golang 刪除文件并遞歸刪除空目錄的操作

    這篇文章主要介紹了Golang 刪除文件并遞歸刪除空目錄的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Golang接入釘釘通知的示例代碼

    Golang接入釘釘通知的示例代碼

    本文主要介紹了Golang接入釘釘通知的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Golang Gin框架實(shí)現(xiàn)多種數(shù)據(jù)格式返回結(jié)果詳解

    Golang 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-05
  • golang實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)事務(wù)的提交與回滾

    golang實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)事務(wù)的提交與回滾

    這篇文章主要介紹了golang實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)事務(wù)的提交與回滾,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • GO語(yǔ)言中Chan實(shí)現(xiàn)原理的示例詳解

    GO語(yǔ)言中Chan實(shí)現(xiàn)原理的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中Chan實(shí)現(xiàn)原理的相關(guān)資料,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下
    2023-02-02
  • 詳解如何使用Bazel構(gòu)建Golang程序

    詳解如何使用Bazel構(gòu)建Golang程序

    這篇文章主要為大家介紹了如何使用Bazel構(gòu)建Golang程序?qū)嵗斀猓行枰呐笥芽梢越梃b參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • GO語(yǔ)言并發(fā)編程之互斥鎖、讀寫(xiě)鎖詳解

    GO語(yǔ)言并發(fā)編程之互斥鎖、讀寫(xiě)鎖詳解

    這篇文章主要介紹了GO語(yǔ)言并發(fā)編程之互斥鎖、讀寫(xiě)鎖詳解,本文是GO并發(fā)編程實(shí)戰(zhàn)一書(shū)的樣章,詳細(xì)講解了互斥鎖、讀寫(xiě)鎖,然后給出了一個(gè)完整示例,需要的朋友可以參考下
    2014-11-11

最新評(píng)論