go get github.com/spf13/viper
1. 设置配置文件的信息
etcd:
ip: "192.168.6.106"
port: 2379
dialTimeout: 3
redis:
ip: "192.168.6.107"
port: 6379
password: "root@1028"
2. 读取配置文件的信息
2.1 通过kv的方式
package main
import (
"fmt"
"github.com/spf13/viper"
"log"
)
func main() {
v := viper.New()
v.SetConfigName("config") // 指定配置文件的名称
v.SetConfigType("yaml") // 指定配置文件的类型
v.AddConfigPath("./config") // 指定配置文件所在的目录
err := v.ReadInConfig() // 加载配置文件信息
if err != nil {
log.Fatal(err)
}
etcdIP := v.Get("etcd.ip")
etcdPort := v.Get("etcd.port")
etcdDialTimeout := v.Get("etcd.dialTimeout")
fmt.Println(etcdIP, etcdPort, etcdDialTimeout)
redisIP := v.Get("redis.ip")
redisPort := v.Get("redis.port")
redisPassword := v.Get("redis.password")
fmt.Println(redisIP, redisPort, redisPassword)
}
2.2 通过结构体的方式
通过结构体映射配置文件的信息,viper通过mapstructure标签来匹配对应的字段。
package main
import (
"fmt"
"github.com/spf13/viper"
"log"
)
type Config struct {
EtcdConfig EtcdConfig `json:"etcd_config" mapstructure:"etcd"`
RedisConfig RedisConfig `json:"redis_config" mapstructure:"redis"`
}
type EtcdConfig struct {
IP string `json:"ip" mapstructure:"ip"`
Port int `json:"port" mapstructure:"port"`
DialTimeout int `json:"dial_timeout" mapstructure:"dial_timeout"`
}
type RedisConfig struct {
IP string `json:"ip" mapstructure:"ip"`
Port int `json:"port" mapstructure:"port"`
Password string `json:"password" mapstructure:"password"`
}
func main() {
v := viper.New()
v.SetConfigName("config") // 指定配置文件的名称
v.SetConfigType("yaml") // 指定配置文件的类型
v.AddConfigPath("./config") // 指定配置文件所在的目录
err := v.ReadInConfig() // 加载配置文件信息
if err != nil {
log.Fatal(err)
}
var cfg Config
if err := v.Unmarshal(&cfg); err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", cfg.EtcdConfig)
fmt.Printf("%+v\n", cfg.RedisConfig)
}