教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang加载yaml类型配置文件问题

Golang加载yaml类型配置文件问题

发布时间:2022-02-21   编辑:jiaochengji.com
教程集为您提供Golang加载yaml类型配置文件问题等资源,欢迎您收藏本站,我们将为您提供最新的Golang加载yaml类型配置文件问题资源
<blockquote>

具体为什么使用yaml类型作为配置文件,有没有更好的配置文件类型,不是这篇研究的主旨。这边主要是介绍在使用<code>yaml.v2</code> 和 <code>viper</code> 两种方式加载<code>yaml</code>类型时候遇到的问题介绍
不关注过程的朋友可以直接跳转到最后查看<code>结果说明</code>

</blockquote><h3>配置文件介绍</h3>

demo 程序路径

<pre><code class="lang-bash">| demo | - config | - - config.yaml | - service | - - config.go </code></pre>

config.yaml 配置文件

<pre><code class="lang-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: </code></pre><h3>程序说明</h3>

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

<pre><code class="lang-go">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"` } </code></pre>

然后定义一个全局变量<code>configuration</code> 来存放解析,然后定义两个函数<code>LoadConfiguration()</code> 和 <code>GetConfiguration()</code> 分别解析和获取配置

<pre><code class="lang-go">var ( configuration *Configuration ) // yaml.v2 func LoadConfiguration(path string) error {} // viper func LoadConfigurationV2() error {} // GetConfiguration func GetConfiguration() *Configuration { return configuration } </code></pre><h3>使用 yaml.v2</h3>

使用之前先安装对应的包

<pre><code class="lang-go">go get gopkg.in/yaml.v2 </code></pre>

加载配置的函数

<pre><code class="lang-go">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 } </code></pre><h3>使用 viper</h3>

使用之前先安装对应的包

<pre><code class="lang-go">go get github.com/spf13/viper </code></pre>

加载配置的函数

<pre><code class="lang-go">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 } </code></pre><h3>主函数执行观察结果</h3><pre><code class="lang-go">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) } </code></pre>

第一次执行结果

yaml.v2

第二次执行结果

viper

第三次执行结果(第三次执行的时候修改<code>Configuration</code> 结构体中的<code>SMTPHost</code> 为 <code>SMTP_Host</code>)

image.png

<h3>结果说明</h3><ul><li>从两次结果执行观察到,<code>viper</code>解析的时候是有格式要求的,原始配置文件中<code>smtp_host</code> 那么在使用viper的时候必须是<code>SMTP_Host</code>,需要<code>格式上保持一致</code>, <code>SMTPHost</code> 就解析失败;</li><li>但是使用<code>yaml.v2</code>的时候完全没有这个问题,格式任意即可</li></ul>

验证代码详见 https://gitee.com/colin5063/go-learn/tree/master/20201221-yaml

到此这篇关于“ Golang加载yaml类型配置文件问题”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang整洁之道(一)
Golang加载yaml类型配置文件问题
Golang——使用yaml配置文件
golang之配置文件
golang使用yaml格式解析构建配置文件
基于golang语言web框架gin搭建应用-02配置文件(yml)
golang中解析yaml配置文件
Golang 入门系列(九) 如何读取YAML,JSON,INI等配置文件
python 怎么读取yaml文件
Go语言从入门到精通 -【web项目实战篇】- 读取配置文件

[关闭]
~ ~