先说一下,这里用到了很多关于反射类型的功能,可能刚开始看代码,如果对反射不熟悉的可能会不是非常清晰,但是同时也是为了更好的理解golang中的反射,同时如果后面想在代码中可以直接从我的git地址get:
go get github.com/pythonsite/config_yaml
直接上代码:
//可以用于处理读yaml格式的配置文件,同时也可以用于理解golang中的反射
package config_yaml
import ("strings"
"errors"
"io/ioutil"
"gopkg.in/yaml.v2"
"reflect"
"fmt"
"strconv")
type ConfigEngine struct {
data map[interface{}]interface{}
}//将ymal文件中的内容进行加载
func (c*ConfigEngine) Load (path string) error {
ext :=c.guessFileType(path)if ext == ""{
return errors.New("cant not load" + path + " config")
}
return c.loadFromYaml(path)
}//判断配置文件名是否为yaml格式
func (c*ConfigEngine) guessFileType(path string) string {
s := strings.Split(path,".")
ext := s[len(s) - 1]
switch ext {case "yaml","yml":
return"yaml"}
return""}//将配置yaml文件中的进行加载
func (c*ConfigEngine) loadFromYaml(path string) error {
yamlS,readErr :=ioutil.ReadFile(path)if readErr !=nil {
return readErr
}//yaml解析的时候c.data如果没有被初始化,会自动为你做初始化
err := yaml.Unmarshal(yamlS, &c.data)if err !=nil {
return errors.New("can not parse "+ path + " config")
}
return nil
}//从配置文件中获取值
func (c*ConfigEngine) Get(name string) interface{}{
path := strings.Split(name,".")
data :=c.data
for key, value :=range path {
v, ok :=data[value]if !ok {
break
}if (key + 1) ==len(path) {
return v
}if reflect.TypeOf(v).String() == "map[interface {}]interface {}"{
data=v.(map[interface {}]interface {})
}
}
return nil
}//从配置文件中获取string类型的值
func (c*Confi