Golang使用yaml第三方包无法正确解析配置参数

Posted 5055555

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang使用yaml第三方包无法正确解析配置参数相关的知识,希望对你有一定的参考价值。

首先我的yaml文件是这样的:

setting:
  corpid: 1
  corpsecret: 2

然后附上解析代码:

package main

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

type Config struct {
	Corpid     string `yaml:"corpid"`
	Corpsecret string `yaml:"corpsecret"`
}

func main() {
	r, err := ioutil.ReadFile("conf/conf.yaml")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(string(r))

	config:=Config{}
	err = yaml.Unmarshal(r, &config)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("yaml文件解析: ", config)
}

咋一看没有没有啥问题,struct结构也是大写开头的,看github上官方Example 我开始以为OK了,结果程序的确没有报错,但是结果很出乎我的意料

返回的是空的结构!

通过翻看源码看到了这么一段话,

所以想到了下面这种方法来解决问题,把Config结构改成set结构:

package main

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

type set struct {
	Set map[string]interface{} `yaml:"setting""`
}

func main() {
	r, err := ioutil.ReadFile("conf/conf.yaml")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(string(r))

	// config:=Config{}
	s := set{}
	err = yaml.Unmarshal(r, &s)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("解析内容: ", s)
}

这次问题就解决了,可以得到yaml解析出的配置内容了。

接下里我们可以加一个循环,把里面的数值拿出来

package main

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

type set struct {
	Set map[string]interface{} `yaml:"setting""`
}

func main() {
	r, err := ioutil.ReadFile("conf/conf.yaml")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(string(r))

	// config:=Config{}
	s := set{}
	err = yaml.Unmarshal(r, &s)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("解析内容: ", s)

	for key, value := range s.Set {
		fmt.Print(key," ")
		fmt.Println(value)
	}
}

结果:

以上是关于Golang使用yaml第三方包无法正确解析配置参数的主要内容,如果未能解决你的问题,请参考以下文章

GO解析yaml文件

golang yaml配置文件解析

Golang - 用于解析 yaml 文件并检查对象的单元测试

使用golang解析yamljsonxml文件

Golang yaml与toml解析

golang几种常用配置文件使用方法总结(yamltomljsonxmlini)