config.json
{
"log": {
"prefix": "[MY-LOG] ",
"logFile": true,
"stdout": "DEBUG",
"file": "WARNING"
}
}
config.go
type Log struct {
Prefix string `mapstructure:"prefix" json:"prefix"`
LogFile bool `mapstructure:"log-file" json:"logFile"`
Stdout string `mapstructure:"stdout" json:"stdout"`
File string `mapstructure:"file" json:"file"`
}
type Config struct {
Log Log `json:"log"`
}
var (
CONFIG config.Config
LOG *oplogging.Logger
)
读取配置
func InitConfigFromJson() {
// 打开文件
RootPath, _ = os.Getwd()
config_path := path.Join(RootPath, "config", "config.json")
file, _ := os.Open(config_path)
// 关闭文件
defer file.Close()
//NewDecoder创建一个从file读取并解码json对象的*Decoder,解码器有自己的缓冲,并可能超前读取部分json数据。
decoder := json.NewDecoder(file)
//Decode从输入流读取下一个json编码值并保存在v指向的值里
err := decoder.Decode(&global.CONFIG)
if err != nil {
panic(err)
}
}
config.txt
ip=127.0.0.1 port=3344
读取
package main
import (
"bufio"
"io"
"os"
"strings"
)
//读取key=value类型的配置文件
func InitConfig(path string) map[string]string {
config := make(map[string]string)
f, err := os.Open(path)
defer f.Close()
if err != nil {
panic(err)
}
r := bufio.NewReader(f)
for {
b, _, err := r.ReadLine()
if err != nil {
if err == io.EOF {
break
}
panic(err)
}
s := strings.TrimSpace(string(b))
index := strings.Index(s, "=")
if index < 0 {
continue
}
key := strings.TrimSpace(s[:index])
if len(key) == 0 {
continue
}
value := strings.TrimSpace(s[index+1:])
if len(value) == 0 {
continue
}
config[key] = value
}
return config
}
func main() {
config := InitConfig("config.txt")
ip := config["ip"]
port := config["port"]
fmt.Println("ip=",string(ip)," port=",string(port))
}
Viper是一个方便Go语言应用程序处理配置信息的库。它可以处理多种格式的配置。它支持的特性:
config.json
#json文件
{
"appId": "123456789",
"secret": "maple123456",
"host": {
"address": "localhost",
"port": 5799
}
}
读取
package main
import (
"fmt"
"github.com/spf13/viper"
)
//定义config结构体
type Config struct {
AppId string
Secret string
Host Host
}
//json中的嵌套对应结构体的嵌套
type Host struct {
Address string
Port int
}
func main() {
config := viper.New()
config.AddConfigPath("./kafka_demo")
config.SetConfigName("config")
config.SetConfigType("json")
if err := config.ReadInConfig(); err != nil {
panic(err)
}
v.WatchConfig()
v.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("config file changed:", e.Name)
if err := config.ReadInConfig(); err != nil {
panic(err)
}
})
fmt.Println(config.GetString("appId"))
fmt.Println(config.GetString("secret"))
fmt.Println(config.GetString("host.address"))
fmt.Println(config.GetString("host.port"))
//直接反序列化为Struct
var configjson Config
if err :=config.Unmarshal(&configjson);err !=nil{
fmt.Println(err)
}
fmt.Println(configjson.Host)
fmt.Println(configjson.AppId)
fmt.Println(configjson.Secret)
config.yaml
log: prefix: ‘[MY-LOG] ‘ log-file: true stdout: ‘DEBUG‘ file: ‘DEBUG‘
config.go
type Log struct {
Prefix string `mapstructure:"prefix" json:"prefix"`
LogFile bool `mapstructure:"log-file" json:"logFile"`
Stdout string `mapstructure:"stdout" json:"stdout"`
File string `mapstructure:"file" json:"file"`
}
type Config struct {
Log Log `json:"log"`
}
global
package global import ( oplogging "github.com/op/go-logging" "github.com/spf13/viper" "go_Logger/config" ) var ( CONFIG config.Config VP *viper.Viper LOG *oplogging.Logger )
读取
const defaultConfigFile = "config/config.yaml"
func init() {
v := viper.New()
v.SetConfigFile(defaultConfigFile)
err := v.ReadInConfig()
if err != nil {
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
v.WatchConfig()
v.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("config file changed:", e.Name)
if err := v.Unmarshal(&global.CONFIG); err != nil {
fmt.Println(err)
}
})
if err := v.Unmarshal(&global.CONFIG); err != nil {
fmt.Println(err)
}
global.VP = v
}
原文:https://www.cnblogs.com/zhangyafei/p/12863384.html