.ini
。
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
hideDotFiles = dotGitOnly
[remote "origin"]
url = https://github.com/davyxu/cellnet
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[ ]
拆分為多個“段”(section)。每個段中又以=
分割為“鍵”和“值”。;
置於行首視為註釋,注釋後將不會被處理和識別,如下所示:
[sectionl]
key1=value1
;key2=value2
[section2]
package main import ( "bufio" "fmt" "os" "strings" ) // 根據檔名,段名,鍵名獲取ini的值 func getValue(filename, expectSection, expectKey string) string { // 開啟檔案 file, err := os.Open(filename) // 檔案找不到,返回空 if err != nil { return "" } // 在函數結束時,關閉檔案 defer file.Close() // 使用讀取器讀取檔案 reader := bufio.NewReader(file) // 當前讀取的段的名字 var sectionName string for { // 讀取檔案的一行 linestr, err := reader.ReadString('n') if err != nil { break } // 切掉行的左右兩邊的空白字元 linestr = strings.TrimSpace(linestr) // 忽略空行 if linestr == "" { continue } // 忽略註釋 if linestr[0] == ';' { continue } // 行首和尾巴分別是方括號的,說明是段標記的起止符 if linestr[0] == '[' && linestr[len(linestr)-1] == ']' { // 將段名取出 sectionName = linestr[1 : len(linestr)-1] // 這個段是希望讀取的 } else if sectionName == expectSection { // 切開等號分割的鍵值對 pair := strings.Split(linestr, "=") // 保證切開只有1個等號分割的簡直情況 if len(pair) == 2 { // 去掉鍵的多餘空白字元 key := strings.TrimSpace(pair[0]) // 是期望的鍵 if key == expectKey { // 返回去掉空白字元的值 return strings.TrimSpace(pair[1]) } } } } return "" } func main() { fmt.Println(getValue("example.ini", "remote "origin"", "fetch")) fmt.Println(getValue("example.ini", "core", "hideDotFiles")) }本例並不是將整個 INI 檔案讀取儲存後再獲取需要的欄位資料並返回,這裡使用 getValue() 函數,每次從指定檔案中找到需要的段(Section)及鍵(Key)對應的值。
func getValue(filename, expectSection, expectKey string) string
引數說明如下。
func main() {
fmt.Println(getValue("example.ini", "remote "origin"", "fetch"))
fmt.Println(getValue("example.ini", "core", "hideDotFiles"))
}
+refs/heads/*:refs/remotes/origin/*
dotGitOnly
[remote "origin"]
的 "fetch" 鍵對應的值;dotGitOnly 表示 INI 檔案中[core]
中鍵名為 "hideDotFiles" 的值。
注意 main 函數的第 2 行中,由於段名中包含雙引號,所以使用進行跳脫。
// 開啟檔案 file, err := os.Open(filename) // 檔案找不到,返回空 if err != nil { return "" } // 在函數結束時,關閉檔案 defer file.Close()程式碼說明如下:
// 使用讀取器讀取檔案 reader := bufio.NewReader(file) // 當前讀取的段的名字 var sectionName string for { // 讀取檔案的一行 linestr, err := reader.ReadString('n') if err != nil { break } // 切掉行的左右兩邊的空白字元 linestr = strings.TrimSpace(linestr) // 忽略空行 if linestr == "" { continue } // 忽略註釋 if linestr[0] == ';' { continue } //讀取段和鍵值的程式碼 //... }程式碼說明如下:
n
,也就是行結束。這個函數返回讀取到的行字串(包括n
)和可能的讀取錯誤 err,例如檔案讀取完畢。;
分號時,表示這一行是注釋行,忽略一整行的讀取。[
開頭,以]
結尾,因此可以直接判斷行首和行尾的字串匹配段的起止符匹配時讀取的是段,如下圖所示。