golang解析配置文件

首先定义一个原始的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}
相关推荐
Fcy64821 小时前
C++ set&&map的模拟实现
开发语言·c++·stl
Android系统攻城狮21 小时前
Android ALSA进阶之处理PCM的ioctl命令snd_pcm_lib_ioctl:用法实例(一百)
android·pcm·alsa·音频进阶
你怎么知道我是队长1 天前
C语言---枚举变量
c语言·开发语言
李慕婉学姐1 天前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
吃茄子的猫1 天前
quecpython中&的具体含义和使用场景
开发语言·python
云栖梦泽1 天前
易语言中小微企业Windows桌面端IoT监控与控制
开发语言
数据大魔方1 天前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
诸神黄昏EX1 天前
Android Build系列专题【篇六:VINTF机制】
android
Edward.W1 天前
Python uv:新一代Python包管理工具,彻底改变开发体验
开发语言·python·uv
小熊officer1 天前
Python字符串
开发语言·数据库·python