[Golang] 从零開始写Socket Server(4):将执行參数放入配置文件(XML/YAML)
为了将我们写好的Server公布到server上。就要将我们的代码进行build打包。这样假设以后想要改动一些代码的话。须要又一次给代码进行编译打包并上传到server上。
显然,这么做过于繁琐。
接下来就是解析他们了。眼下golang官方还没有解析yaml的库。因此我推荐使用第三方的go-yaml包,
这里相同给出解析xml配置文件的代码:
执行效果例如以下:
显然,这么做过于繁琐。
。。因此常见的做法都是将Server执行中可能会频繁变更的变量、数值写入配置文件里。这样直接让程序从配置文件读取參数,避免对代码频繁的操作。
关于配置文件的格式,在这里推荐YAML 和XML~ XML是传统的配置文件写法,只是本人比較推荐yaml,他比XML要更加人性化,也更好写,关于yaml的具体信息能够參考: yaml官网
比方我们能够将Server监听的port作为变量,写入配置文件 config.yaml 和 config.xml,放入代码的根文件夹下。这样当我们想要更换serverport的时候。仅仅要在配置文件里改动port相应的值就能够拉。 config.xml内容例如以下:
<?xml version="1.0" encoding="UTF-8"?> <Config1>GetConfig</Config1> <Config2>THE</Config2> <Config3>Information</Config3> <Feature1>HereIsTEST1</Feature1> <Feature2>1024</Feature2> <Feature3>Feature23333</Feature3>
config.yaml内容例如以下:
Address: 172.168.0.1 Config1: Easy Config2: Feature1: 2 Feature2: [3, 4] Port: :6060 Config4: IS Config5: ATest
接下来就是解析他们了。眼下golang官方还没有解析yaml的库。因此我推荐使用第三方的go-yaml包,
地址例如以下: go-yaml 。go get安装该包后,我们就能够通过他解析文件啦:
//解析文件。取出全部參数 func GetYamlConfig() map[interface{}]interface{}{ data, err := ioutil.ReadFile("config.yaml") //将解析出的參数转为map的形式 m := make(map[interface{}]interface{}) if err != nil { LogErr("error: %v", err) } err = yaml.Unmarshal([]byte(data), &m) return m } //依据需求取出相应值 func GetElement(key string,themap map[interface{}]interface{})string { if value,ok:=themap[key];ok { return value.(string) } LogErr("Can't find the *.yaml") return "" }
这里相同给出解析xml配置文件的代码:
func GetXMLConfig() map[string]string { var t xml.Token var err error Keylst := make([]string,6) Valuelst:=make([]string,6) //将解析出的元素填入map中,便于查找 map1:=make(map[string]string) content, err := ioutil.ReadFile("config.xml") CheckError(err) decoder := xml.NewDecoder(bytes.NewBuffer(content)) i:=0 j:=0 for t, err = decoder.Token(); err == nil; t, err = decoder.Token() { switch token := t.(type) { // 处理元素 case xml.StartElement: name := token.Name.Local Keylst[i]=string(name) i=i+1 case xml.CharData: content1 := string([]byte(token)) //Valuelst=append(Valuelst,content1) Valuelst[j]=content1 j=j+1 } } for count:=0;count<len(Keylst);count++{ map1[Keylst[count]]=Valuelst[count] } return map1 } //取出map的函数跟yaml中的几乎相同,此处略过
执行效果例如以下:
我已经把SocketServer系列的代码整合到了一起,公布到了我个人的github上:点击链接。 希望大家有兴趣的能够学习star一下~