[Golang] 從零開始寫Socket Server(4):將執行引數放入配置檔案(XML/YAML)
阿新 • • 發佈:2018-10-31
為了將我們寫好的Server釋出到伺服器上,就要將我們的程式碼進行build打包,這樣如果以後想要修改一些程式碼的話,需要重新給程式碼進行編譯打包並上傳到伺服器上。
顯然,這麼做過於繁瑣。。。因此常見的做法都是將Server執行中可能會頻繁變更的變數、數值寫入配置檔案中,這樣直接讓程式從配置檔案讀取引數,避免對程式碼頻繁的操作。
關於配置檔案的格式,在這裡推薦YAML 和XML~ XML是傳統的配置檔案寫法,不過本人比較推薦yaml,他比XML要更加人性化,也更好寫,關於yaml的詳細資訊可以參考: yaml官網
接下來就是解析他們了,目前golang官方還沒有解析yaml的庫,因此我推薦使用第三方的go-yaml包,
這裡同樣給出解析xml配置檔案的程式碼:
執行效果如下:
顯然,這麼做過於繁瑣。。。因此常見的做法都是將Server執行中可能會頻繁變更的變數、數值寫入配置檔案中,這樣直接讓程式從配置檔案讀取引數,避免對程式碼頻繁的操作。
關於配置檔案的格式,在這裡推薦YAML 和XML~ XML是傳統的配置檔案寫法,不過本人比較推薦yaml,他比XML要更加人性化,也更好寫,關於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一下~