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.go
和 log.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()
}