yaml.v2viperyaml结果说明

配置文件介绍

demo 程序路径

| demo
| - config
| - - config.yaml
| - service
| - - config.go

config.yaml 配置文件

$ cat config/config.yaml
dsn: bamboo:Bamboo@tcp(127.0.0.1:3306)/bamboo?charset=utf8mb4&parseTime=True&loc=Local

qiniu_bucket:
qiniu_accesskey:
qiniu_secretkey:

smtp_host: smtp.exmail.qq.com
smtp_username:
smtp_password:


port: 8889
smtp:
  host: smtp.exmail.qq.com
  username:
  password:

程序说明

在编写函数之前,先定义配置文件struct来对应配置文件,这是最基础的一步

type SMTPConfig struct {
    Host        string  `yaml:"host"`
    Username    string  `yaml:"username"`
    Password    string  `yaml:"password"`
}

type Configuration struct {
    DSN     string  `yaml:"dsn"`

    SMTPHost    string  `yaml:"smtp_host"`
    SMTPUsername    string  `yaml:"smtp_usernane"`
    SMTPPassword    string  `yaml:"smtp_password"`

    QiniuBucket string  `yaml:"qiniu_bucket"`
    QiniuAccessKey  string  `yaml:"qiniu_accesskey"`
    QiniuSecretKey  string  `yaml:"qiniu_secretkey"`
    Port        int `yaml:"port"`
    SMTP        SMTPConfig  `yaml:"smtp"`
}
configurationLoadConfiguration()GetConfiguration()
var (
    configuration *Configuration
)
// yaml.v2
func LoadConfiguration(path string) error {}
// viper
func LoadConfigurationV2() error {}
// GetConfiguration
func GetConfiguration() *Configuration {
    return configuration
}

使用 yaml.v2

使用之前先安装对应的包

go get gopkg.in/yaml.v2

加载配置的函数

func LoadConfiguration(path string) error {
    data, err := ioutil.ReadFile(path)
    if err != nil {
        return err
    }

    var config Configuration
    err = yaml.Unmarshal(data, &config)
    if err != nil {
        return err
    }

    fmt.Println("in func(yaml.v2): ", config)
    configuration = &config
    return nil
}

使用 viper

使用之前先安装对应的包

go get github.com/spf13/viper

加载配置的函数

func LoadConfigurationV2() error {
    v := viper.New()
    v.AddConfigPath("./config/")
    v.SetConfigType("yaml")
    v.SetConfigName("config")

    if err := v.ReadInConfig(); err != nil {
        return err
    }


    var config Configuration
    if err := v.Unmarshal(&config); err != nil {
        return nil
    }

    fmt.Println("in func(viper): ", config)
    configuration = &config
    return nil
}

主函数执行观察结果

func main() {
    // 第一次执行 yaml.v2, 注释掉LoadConfigurationV2这一行
    path := "./config/config.yaml"
    err := LoadConfiguration(path)
    // 第二次执行 viper, 注释掉上面两行,放开下面这一行
    // err := LoadConfigurationV2()
    if err != nil {
        fmt.Println("Load configuration err ", err)
    }

    fmt.Println("in main: ", GetConfiguration().DSN)
    fmt.Println("in main: ", GetConfiguration().QiniuBucket)
    fmt.Println("in main: ", GetConfiguration().SMTP.Host)
}

第一次执行结果

yaml.v2

第二次执行结果

viper
ConfigurationSMTPHostSMTP_Host
image.png

结果说明

vipersmtp_hostSMTP_Host格式上保持一致SMTPHostyaml.v2

有疑问加站长微信联系(非本文作者)