[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一下~
[Golang] 从零開始写Socket Server(4):将执行參数放入配置文件(XML/YAML)的更多相关文章
- [Golang] 从零開始写Socket Server(3): 对长、短连接的处理策略(模拟心跳)
通过前两章,我们成功是写出了一套凑合能用的Server和Client,并在二者之间实现了通过协议交流.这么一来,一个简易的socket通讯框架已经初具雏形了,那么我们接下来做的.就是想办法让这个框架更 ...
- [Golang] 从零開始写Socket Server(2): 自己定义通讯协议
在上一章我们做出来一个最基础的demo后,已经能够初步实现Server和Client之间的信息交流了~ 这一章我会介绍一下怎么在Server和Client之间实现一个简单的通讯协议.从而增强整个信息交 ...
- 《从零開始搭建游戏server》项目公布到Linux环境
前言: 之前我们提及了怎样使用Maven来创建.管理和打包项目,也简单过了一遍Linux中搭建Java开发环境的步骤,如今我们就開始将我们之前开发的项目demo公布到Linux环境下.并让它正常执行起 ...
- 从零開始写游戏引擎(一) - project创建以及文件夹设置还有版本号控制
一句话提要 好的開始等于成功了一半. 创建文件夹结构 project文件夹下最好分为以下几个文件夹 Docs - 开发文档,设计文档 Assets - 角色,动作,模型和音效等 Source - 代码 ...
- 从零開始怎么写android native service?
从零開始怎么写android native service Android service对于从事android开发的人都不是一个陌生的东西,非常多人可能会认为服务非常easy. 服务是简单,由于复杂 ...
- 从零開始学习OpenCL开发(一)架构
多谢大家关注 转载本文请注明:http://blog.csdn.net/leonwei/article/details/8880012 本文将作为我<从零開始做OpenCL开发>系列文章的 ...
- # 从零開始搭建Hadoop2.7.1的分布式集群
Hadoop 2.7.1 (2015-7-6更新),Hadoop的环境配置不是特别的复杂,可是确实有非常多细节须要注意.不然会造成很多配置错误的情况.尽量保证一次配置正确防止重复改动. 网上教程有非常 ...
- Bmob移动后端云服务平台--Android从零開始--(二)android高速入门
Bmob移动后端云服务平台--Android从零開始--(二)android高速入门 上一篇博文我们简介何为Bmob移动后端服务平台,以及其相关功能和优势. 本文将利用Bmob高速实现简单样例,进一步 ...
- 《PHP 5.5从零開始学(视频教学版)》内容简单介绍、文件夹
<PHP 5.5从零開始学(视频教学版)>当当网购买地址: http://product.dangdang.com/23586810.html <PHP 5.5从零開始学(视频教学版 ...
随机推荐
- Linux学习之常用压缩命令(三)
(一)常用压缩命令 (1)gzip命令 (2)gunzip命令 (3)tar命令 (4)zip命令 (5)unzip命令 (6)bzip2命令 (7)bunzip2命令 (一)常用压缩命令 (1)gz ...
- CentOS 7.1系统自动重启的Bug定位过程
[问题] 有同事反应最近有多台MongoDB的服务器CentOS 7.1系统会自动重启,分析了下问题原因. [排查过程] 1. 检查系统日志/var/log/message,并没有记录异常信息,jou ...
- vue中的dom基本渲染
一.输出动态标签请只对可信内容使用HTML插值,绝不要对用户提供的内容使用插值,容易导致xss攻击. <div id="J_app"> <div v-html=& ...
- BZOJ.3329.Xorequ(数位DP)
题目链接 x^3x=2x -> x^2x=3x 因为a^b+((a&b)<<1)=a+b,x^2x=x+2x,所以x和2x的二进制表示中不存在相邻的1. (或者,因为x+2x ...
- PHP文本处理 中文汉字字符串 转换为数组
在PHP中我们可以通过str_split 将字符串转换为数组,但是却对中文无效,下面记录一下个人将中文字符串转换为数组的方法. 用到的PHP函数 mb_strlen — 获取字符串的长度 functi ...
- centos7环境下对防火墙的操作
我是运行了systemctl stop firewalld.service && systemctl disabl e firewalld.service命令于是显示 [root@in ...
- arcgis pro行列转换
行转列 列转行
- Fragment的可见再载入的方法(真正的Fragment的OnResume和OnPause)
一 起因 我们在做应用的过程中,一个应用的界面可能是多个Fragment切换而成的.可是如果在每次应用启动的时候就去载入大量的网络数据(如果你的每一个Fragment都须要载入网络数据.你也能够理解为 ...
- 基于 CentOS Mysql 安装与主从同步配置详解
CentOS Mysql 安装 Mysql (Master/Slave) 主从同步 1.为什么要使用主从同步 1.如果主服务器出现问题,可以快速切换到从服务器提供的服务 2.可以在从服务器上执行查询操 ...
- !HDU 1574 RP-dp-(重点在状态确定)
题意:有n件事.每件事若发生有两种情况.添加RP为a,可是收益会降低c:降低R为a,收益会添加c. 每件事可以发生的前提是小于等于或者大于等于门限值b.求最大收益. 分析:这题我没找到状态,所以就不会 ...