1. 程式人生 > >[Golang] 從零開始寫Socket Server(4):將執行引數放入配置檔案(XML/YAML)

[Golang] 從零開始寫Socket Server(4):將執行引數放入配置檔案(XML/YAML)

    為了將我們寫好的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中的差不多,此處略過




執行效果如下:




我已經把SocketServer系列的程式碼整合到了一起,釋出到了我個人的github上:點選連結, 希望大家有興趣的可以學習star一下~