Go yaml 文件解析,替换 JSON 配置 | Go 主题月

3,058 阅读2分钟

使用 gin web 框架,在 moose-go 基础之上开发

在实际开发中,常用配置文件格式 properties、yaml、json、ini

解析 yaml 格式文件

使用第三方模块

github.com/go-yaml/yam…

安装

go get gopkg.in/yaml.v2

两个方法

Marshal 序列化 Unmarshal 反序列化

使用

数据
name: 江景
age: 18
hobby: ["code", "read"]
结构体
type Info struct {
  Name  string
  Age   int
  Hobby []string
}
测试用例

func TestTemplate(t *testing.T) {

	type Info struct {
		Name  string
		Age   int
		Hobby []string
	}

	data := `
name: 江景
age: 18
hobby: ["code", "read"]
`

	info := Info{}
	err := yaml.Unmarshal([]byte(data), &info)
	if err != nil {
		t.Log(err)
		return
	}

	t.Log(info)
}
运行测试用例
λ go test -v .\test\yaml_test.go
=== RUN   TestTemplate
    yaml_test.go:33: {江景 18 [code read]}
--- PASS: TestTemplate (0.00s)
PASS
ok      command-line-arguments  0.040s

替换 JSON 配置

在原来配置数据库连接和应用信息使用 json 文件格式,现在替换为 yaml 配置文件格式

新建 application-dev.yml

app:
  name: moose-go
  mode: debug

mysql:
  host: "127.0.0.1"
  port: "3306"
  driverName: mysql
  username: root
  password: "123456"
  database: moose-go

redis:
  host: localhost:6379

定义对应结构体

package model

type AppConfig struct {
	App struct {
		Name string `yaml:"name" json:"name"`
		Mode string `yaml:"mode" json:"mode"`
	}

	MySql struct {
		Host       string `yaml:"host" json:"host"`
		Port       string `yaml:"port" json:"port"`
		DriverName string `yaml:"driverName" json:"driverName"`
		UserName   string `yaml:"username" json:"username"`
		Password   string `yaml:"password" json:"password"`
		DataBase   string `yaml:"database" json:"database"`
	}

	Redis struct {
		Host string `yaml:"host" json:"host"`
	}
}

封装解析方法

var _yamlCfg *model.AppConfig = nil

func GetYamlConfig() *model.AppConfig {
	return _yamlCfg
}

func ParseYamlConfig(path string) *model.AppConfig {

	file, err := os.Open(path)
	if err != nil {
		panic(err)
	}

	defer file.Close()

	data, err := ioutil.ReadAll(file)

	err = yaml.Unmarshal([]byte(data), &_yamlCfg)

	if err != nil {
		panic(err)
	}

	log.Println(_yamlCfg)

	return _yamlCfg
}

使用

替换原来 json 格式配置

main.go

func init() {
	// util.ParseJSONConfig("./config/application-dev.json")

  // 读取文件
	util.ParseYamlConfig("./config/application-dev.yml")
	// util.ParseYamlConfig("./config/application-prod.yml")
}

orm_engine.go

// .....

func NewOrmEngine() {

  // 从读取的文件中获取结构体信息
	appInfo := util.GetYamlConfig()

	url := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8", appInfo.MySql.UserName, appInfo.MySql.Password, appInfo.MySql.Host, appInfo.MySql.Port, appInfo.MySql.DataBase)
	engine, err := xorm.NewEngine(appInfo.MySql.DriverName, url)

	if err != nil {
		log.Panic(err.Error())
		return
	}

// .....

注意点

  • 定义结构,定义字段必须大写开头,比如 name ==> Name
  • 定义结构体,可以使用 tag 标签,比如 Name string yaml:"name"
  • 读取配置文件结构需要和定义结构体保持一致