golang 读取yaml配置文件中的数据 两种方式:yaml.v2 和 Viper

golang 读取yaml配置文件中的数据

yaml 配置文件 config.yaml 中 写数据:

app:
  host: 127.0.0.1
  port: 3306
  username: admin
  password: admin
log:
  suffix: log
  maxSize: 5

config 文件 下 是 配置文件对应的结构体 config.go

package config

type Config struct {
	App App `yaml:"app" json:"app"`
	Log Log `yaml:"log" json:"log"`
}

下面是 具体的结构体 app.golog.go

type App struct {
	Host     string `yaml:"host" json:"host"`
	Port     int    `yaml:"port" json:"port"`
	Username string `yaml:"username" json:"username"`
	Password string `yaml:"password" json:"password"`
}

type Log struct {
	Suffix  string `yaml:"suffix" json:"suffix"`
	MaxSize int    `yaml:"maxSize" json:"maxsize"`
}

这种写结构体的方法比较有层级,后续配置文件需要增加数据,可以对不同的配置用不同的结构体,使用起来不会杂乱;

方法一: 使用yaml.v2 读取配置文件数据,需要导入对应的包 :yaml.v2
需要注意的是:yaml.v2只能读取yaml格式的文件

import (
	"gopkg.in/yaml.v2"
)

使用命令:go get gopkg.in/yaml.v2 导入对应 的包。

使用ioutil导入配置文件,使用yaml.Unmarshal将配置文件读取到结构体中,示例代码如下。

package main

import (
	"GoReadConfig/config"
	"fmt"
	"gopkg.in/yaml.v2"
	"io/ioutil"
)

func GetConfigData() {
	//导入配置文件
	yamlFile, err := ioutil.ReadFile("./config.yml")
	if err != nil {
		fmt.Println(err.Error())
	}
	var _config *config.Config
	//将配置文件读取到结构体中
	err = yaml.Unmarshal(yamlFile, &_config)
	if err != nil {
		fmt.Println(err.Error())
	}
	username := _config.App.Username
	fmt.Println("username:" + username )
	fmt.Printf("config.log: %#v\n", _config.Log)

}

func main() {
	GetConfigData()
}

方法二:使用Viper读取配置文件数据
Viper可以处理多种格式的配置,目前已支持从JSON、TOML、YAML、HCL、INI和Java properties文件中读取配置数据。

Viper还能监视配置文件的变动、重新读取配置文件。在项目中可以用作热加载

1.导入 Viper .
go get github.com/spf13/viper

2.使用Viper导入配置文件,并将配置文件读取到结构体中,示例代码如下:

package main

import (
	"GoReadConfig/config"
	"fmt"
	"github.com/spf13/viper"
)

func GetConfigData() {
	//导入配置文件
	viper.SetConfigType("yaml")
	viper.SetConfigFile("./config.yml")
	//读取配置文件
	err := viper.ReadInConfig()
	if err != nil {
		fmt.Println(err.Error())
	}
	var _config *config.Config
	//将配置文件读到结构体中
	err = viper.Unmarshal(&_config)
	if err != nil {
		fmt.Println(err.Error())
	}
	
	username := _config.App.Username
	fmt.Println("username:" + username )
	fmt.Printf("config.log: %#v\n", _config.Log)
}

func main() {
	GetConfigData()
}

你可能感兴趣的:(golang,json,开发语言,后端)