Skip to main content

gva Viper Struct

为什么 gin-vue-admin server/config 中的配置都是 go 类型,而真正的配置却是 config.yaml?

gin-vue-admin 项目中,server/config 中的配置是以 Go 结构体的形式定义的,而实际的配置值则存储在 config.yaml 文件中。这种设计模式称为“配置映射”,主要有以下几个原因和好处:

1. 类型安全

通过在 Go 代码中定义配置结构体,可以确保配置项的类型安全。例如,某个配置项应该是整数类型,另一个应该是字符串类型,这些都可以通过 Go 的类型系统来保证,从而避免类型错误。

2. 便于管理和维护

将配置定义和配置值分开,可以更清晰地管理和维护配置项。配置结构体定义了所有可能的配置项及其类型,而配置文件则存储实际的配置值。

3. 支持多环境配置

通过使用配置文件,可以很方便地支持不同环境的配置。例如,开发环境、测试环境和生产环境可以使用不同的配置文件,而不需要修改代码。

4. 动态加载和热更新

使用配置文件可以方便地实现配置的动态加载和热更新。通过监听配置文件的变化,可以在不重启服务的情况下更新配置。

示例代码

以下是一个示例,展示了如何在 gin-vue-admin 项目中使用配置结构体和配置文件:

1. 配置结构体定义(config.go

package config

type Server struct {
AppName string `mapstructure:"app_name" json:"app_name" yaml:"app_name"`
Port int `mapstructure:"port" json:"port" yaml:"port"`
// 其他配置项...
}

2. 配置文件(config.yaml

app_name: 'Gin-Vue-Admin'
port: 8080
# 其他配置项...

3. 读取配置文件并映射到结构体(main.go

package main

import (
"fmt"
"github.com/spf13/viper"
"gin-vue-admin/server/config"
)

func main() {
// 初始化 Viper
v := viper.New()
v.SetConfigFile("config.yaml")
v.SetConfigType("yaml")
if err := v.ReadInConfig(); err != nil {
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}

// 映射配置到结构体
var serverConfig config.Server
if err := v.Unmarshal(&serverConfig); err != nil {
panic(fmt.Errorf("Unable to decode into struct: %v", err))
}

fmt.Printf("App Name: %s\n", serverConfig.AppName)
fmt.Printf("Port: %d\n", serverConfig.Port)
}

工作流程

  1. 定义配置结构体

    • server/config 中定义配置结构体,确保所有配置项的类型和结构。
  2. 编写配置文件

    • config.yaml 文件中编写实际的配置值。
  3. 加载和解析配置文件

    • 使用 Viper 读取 config.yaml 文件,并将配置值映射到配置结构体中。
  4. 使用配置

    • 在程序中使用配置结构体的值,确保类型安全和便于管理。

总结

通过在 Go 代码中定义配置结构体和使用配置文件存储实际配置值,可以实现类型安全、便于管理和维护、支持多环境配置以及动态加载和热更新等功能。这种设计模式在现代 Go 项目中非常常见,能够提高代码的可维护性和可靠性。