首先定义一个原始的yaml配置文件.
Go
mysql:
host: 127.0.0.1
port: 3306
db: gvb_db
user: root
password: root
LogLevel: dev
defaultStringSize: 256
disableDatetimePrecision: true
dontSupportRenameIndex: true
dontSupportRenameColumn: true
skipInitializeWithVersion: false
logger:
level: info
prefix: '[gvb]'
director: true
showLine: true
LogInConsole: true
system:
host: "0.0.0.0"
port: 8080
env: dev
定义要解析的结构体,
这里分成了多个配置结构体文件,根据不同的服务配置类型进行不同的解析操作.
mysql文件配置(后面的yaml是yaml文件中的字段内容,要准确对应原始yaml文件字段,)
Go
package config
import (
"strconv"
)
type Mysql struct {
Host string `yaml:"host"`
Port int `yaml:"port"`
DB string `yaml:"db"`
User string `yaml:"user"`
Password string `yaml:"password"`
LogLevel string `yaml:"logLevel"` //日志等级,debug 就是输出全部sql dev release
DefaultStringSize int `yaml:"defaultStringSize"`
DisableDatetimePrecision bool `yaml:"disableDatetimePrecision"`
DontSupportRenameIndex bool `yaml:"dontSupportRenameIndex"`
DontSupportRenameColumn bool `yaml:"dontSupportRenameColumn"`
SkipInitializeWithVersion bool `yaml:"skipInitializeWithVersion"`
}
func (m Mysql) Dsn() string {
return m.User + ":" + m.Password + "@tcp(" + m.Host + ":" + strconv.Itoa(m.Port) + ")/" + m.DB + "?" + "charset=utf8&parseTime=True&loc=Local"
}
这里使用直接将解析出来的配置信息组合成了字mysqldsn的链接字符串.后续使用.
logger结构体
Go
package config
type Logger struct {
Level string `yaml:"level"`
Prefix string `yaml:"prefix"`
Director string `yaml:"director"`
ShowLine bool `yaml:"showLine"` //是否显示行号
LogInConsole bool `yaml:"logInConsole"` //是否显示打印路径
}
system结构体
Go
package config
type System struct {
Host string `yaml:"host"`
Port int `yaml:"port"`
Env string `yaml:"env"`
}
读取配置文件,并将配置信息解析到结构体中
Go
package core
import (
"fmt"
"gopkg.in/yaml.v3"
"gvb_server/global"
"log"
"gvb_server/config"
"io/ioutil"
)
// InitConf 读取配置文件中的配置
func InitConf() {
const ConfigFile = "setting.yaml"
c := &config.Config{}
yamlConf, err := ioutil.ReadFile(ConfigFile)
if err != nil {
panic(fmt.Errorf("get yamlConf error: %s", err))
}
err = yaml.Unmarshal(yamlConf, c)
if err != nil {
log.Fatalf("config Init Unmarshal:%v", err)
}
log.Println("config yamlFile load init success.")
global.Conf = c //这里将解析出来的配置信息赋值给一个相同结构体的变量中.就可以根据直接从变量中点出来各部分配置信息了.
}
gorm初始化
Go
package core
import (
"fmt"
"gvb_server/global"
)
func InitGorm() {
dsn := global.Conf.Mysql.Dsn()
fmt.Println(dsn)
}
查看最终输出结果
Go
package main
import (
"fmt"
"gvb_server/core"
"gvb_server/global"
)
func main() {
core.InitConf()
core.InitGorm()
fmt.Println(global.Conf.Mysql)
}
控制台输出结果如下,表示数据解析成功.
Go
2024/07/01 15:38:21 config yamlFile load init success.
&{{127.0.0.1 3306 gvb_db root root 256 true true true false} {info [gvb] true t
rue false} {0.0.0.0 8080 dev}}
root:root@tcp(127.0.0.1:3306)/gvb_db?charset=utf8&parseTime=True&loc=Local
{127.0.0.1 3306 gvb_db root root 256 true true true false}