顯然,這麼做過於繁瑣。。。因此常見的做法都是將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中的差不多,此處略過
運行效果如下:
我已經把SocketServer系列的代碼整合到了一起,發佈到了我個人的github上:點擊鏈接, 希望大家有興趣的可以學習star一下~