加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

[Golang] 从零开始写Socket Server(4):将运行参数放入配置文

发布时间:2020-12-16 18:40:02 所属栏目:大数据 来源:网络整理
导读:为了将我们写好的Server发布到服务器上,就要将我们的代码进行build打包,这样如果以后想要修改一些代码的话,需要重新给代码进行编译打包并上传到服务器上。 显然,这么做过于繁琐。。。因此常见的做法都是将Server运行中可能会频繁变更的变量、数值写入配
为了将我们写好的Server发布到服务器上,就要将我们的代码进行build打包,这样如果以后想要修改一些代码的话,需要重新给代码进行编译打包并上传到服务器上。

显然,这么做过于繁琐。。。因此常见的做法都是将Server运行中可能会频繁变更的变量、数值写入配置文件中,这样直接让程序从配置文件读取参数,避免对代码频繁的操作。

关于配置文件的格式,在这里推荐YAML 和XML~ XML是传统的配置文件写法,不过本人比较推荐yaml,他比XML要更加人性化,也更好写,关于yaml的详细信息可以参考:yaml官网

比如我们可以将Server监听的端口作为变量,写入配置文件 config.yaml 和 config.xml,放入代码的根目录下,这样当我们想要更换服务器端口的时候,只要在配置文件中修改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中的差不多,此处略过




运行效果如下:



(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读