• [Golang] 从零開始写Socket Server(4):将执行參数放入配置文件(XML/YAML)


        为了将我们写好的Server公布到server上。就要将我们的代码进行build打包。这样假设以后想要改动一些代码的话。须要又一次给代码进行编译打包并上传到server上。 

       显然,这么做过于繁琐。

    。。因此常见的做法都是将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一下~

  • 相关阅读:
    Guzz入门教程
    设计模式开题
    纪录idea不能创建class类问题(Cannot Create Class)
    dbrouter实现流程图
    记录一次concurrent mode failure问题排查过程以及解决思路
    程序员的自我修养
    CyclicBarrier之共享锁的理解
    sed选项详解(options)
    sed 范围查找
    Sed命令
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7399393.html
Copyright © 2020-2023  润新知