【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)
	}
}

结果: