Golang 多种配置文件解析

Golang 配置文件相关操作

本文以读取数据库配置文件为例

1、JSON 文件

package main

/*
 解析 json 格式的配置文件
文件内容如下:
{
  "type": "json",
  "postgres": {
    "host": "localhost",
    "port": 5432,
    "username": "postgres",
    "password": "postgres",
    "dbname": "bubble"
  }
}
*/
import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
)

// 定义第一级配置文件的结构体
type Config struct {
	Type     string
	Postgres DbConf // 数据类型为第二级配置文件的结构体名称
}

// 定义第二级配置文件的结构体   注意数据类型
type DbConf struct {
	Host     string `json:"host"`
	Port     uint   `json:"port"`
	Username string `json:"username"`
	Password string `json:"password"`
	DbName   string `json:"dbname"`
}

// 定义配置文件结构体
type JsonStruct struct {
}

// 创建配置文件的构造函数
func NewJsonStruct() *JsonStruct {
	return &JsonStruct{}
}

// 加载配置文件
func (jt *JsonStruct) Load(filename string, v interface{}) {
	// 读取配置文件
	data, err := ioutil.ReadFile(filename)
	if err != nil {
		return
	}
	// 解析配置文件
	err = json.Unmarshal(data, v)
	if err != nil {
		return
	}

}

func main() {
	JsonParse := NewJsonStruct()
	v := Config{}
	// 获取配置文件路径
	osGwd, _ := os.Getwd()
	confPath := osGwd + "/conf_json.json"
	// 加载配置文件
	JsonParse.Load(confPath, &v)
	fmt.Printf("配置文件的类型为 %s \n", v.Type)
	fmt.Printf("PG 数据库的配置为 %s \n", v.Postgres)
}

2、YAML 文件(推荐)

package main
/*
解析 yaml 格式的配置文件
文件内容如下:
database:
  postgres:
    host: localhost
    port: 5432
    username: postgres
    password: postgres
    dbname: bubble
} */

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

type YamlStruct struct {
}

func NewYamlStruct() *YamlStruct {
	return &YamlStruct{}
}

type YamlConfig struct {
	DataBase DataBase `yaml:"database"`
}

type DataBase struct {
	PgConf PgConf `yaml:"postgres"`
}

type PgConf struct {
	Host     string `yaml:"host"`
	Port     string `yaml:"port"`
	Username string `yaml:"username"`
	Password string `yaml:"password"`
	DbName   string `yaml:"dbname"`
}

func (yam *YamlStruct) Load(filename string, v interface{}) {
	data, err := ioutil.ReadFile(filename)
	if err != nil {
		panic(err.Error())
	}
	err = yaml.Unmarshal(data, v)
	if err != nil {
		panic(err.Error())
	}
}

func main() {
	YamlStruct := NewYamlStruct()
	v := YamlConfig{}
	osGwd, _ := os.Getwd()
	confPath := osGwd + "/conf_yaml.yaml"
	YamlStruct.Load(confPath, &v)
	fmt.Printf("配置文件的数据为 %s \n", v.DataBase)
}

3、INI 文件

package main

/*
 解析 ini 格式的配置文件
文件内容如下:
mode=debug

[postgres]
host=localhost
port=5432
username=postgres
password=postgres
dbname=bubble
 */

import (
	"fmt"
	"github.com/go-ini/ini"
	"os"
)

//type Postgres struct {
//	Host     string
//	Port     uint
//	Username string
//	Password string
//	DbName   string
//}

func main() {
	osGwd, _ := os.Getwd()
	confPath := osGwd + "/conf_ini.ini"
	config, err := ini.Load(confPath)
	if err != nil {
		panic(err.Error())
	}
	// 可以直接读取配置,并设置默认值
	mode := config.Section("").Key("mode").MustString("debug")
	fmt.Println(mode)
	postgres, err := config.GetSection("postgres")
	if err != nil {
		panic(err.Error())
	}
	// 可通过 Key 去取值
	fmt.Println(postgres.Key("host"))  // localhost
	fmt.Println(postgres.Keys())       //  [localhost 5432 postgres postgres bubble]
	fmt.Println(postgres.KeyStrings()) // [host port username password dbname]
}

posted @ 2022-01-21 12:31  名字到底要多长  阅读(103)  评论(0编辑  收藏  举报