本文对 ini 文件进行解析。
某Delphi项目需要做一些额外的配置,因为原本的配置文件是ini格式的,为不影响已有代码,而且delphi读取解析ini比较简单,考虑到兼容性,最终还是新建单独的ini配置文件并解析。为了对比数据一致性,除了Delphi工程外,还在另一golang工程实现相同的算法,所用的配置文件,完全相同。本文使用 Golang 解析 ini。
github仓库在此下载:
go get gopkg.in/ini.v1
go mod vendor # 加入vendor
截取发文时,最新版本为v1.67.0
。
引入包,代码片段:
import (
ini "gopkg.in/ini.v1"
)
配置文件config.ini
文件内容:
# ini 测试样例
[section1]
sec1 = 110 210 ddd 99 | 133 135 1 2 1588 1509 | 310-410
sec2 = late \n lee | Jim Kent
[section2]
id = 250
arrint = 1 | 2 | 3
arrstr = apple, apple2, apple3
测试代码:
package test
import (
"fmt"
"testing"
"gopkg.in/ini.v1"
)
var (
cfgFile string = "config.ini"
)
func TestIni(t *testing.T) {
fmt.Println("test of ini...")
// 加载
cfg, err := ini.Load(cfgFile)
if err != nil {
fmt.Printf("Fail to read file: %v", err)
return
}
// 读一节
mySection := cfg.Section("section1")
fmt.Println("keystrings:", mySection.KeyStrings())
// 解析
for _, key := range mySection.KeyStrings() {
fmt.Printf("key: [%v]\nvalue: ", key)
values := mySection.Key(key).Strings("|")
for _, item := range values {
fmt.Printf("[%v] ", item)
}
fmt.Printf("\n--------\n")
}
// 按单个字符串
strVlaue := cfg.Section("section2").Key("id").Value()
fmt.Printf("section2.id value: %v\n", strVlaue)
// 数值,以"|"分隔
arrVlaueInt := cfg.Section("section2").Key("arrint").ValidInts("|")
fmt.Printf("section2.arrint value: %v\n", arrVlaueInt)
// 字符串,以","分隔
arrVlaueStr := cfg.Section("section2").Key("arrstr").Strings(",")
fmt.Printf("section2.arrstr value: %v\n", arrVlaueStr)
// 写入ini
cfg.Section("").Key("name").SetValue("foobar")
cfg.Section("info").Key("appVer").SetValue("1.3")
cfg.Section("info").Key("author").SetValue("Late Lee")
// 另起文件
cfg.SaveTo("output.ini")
}
输出结果:
test of ini...
keystrings: [sec1 sec2]
key: [sec1]
value: [110 210 ddd 99] [133 135 1 2 1588 1509] [310-410]
--------
key: [sec2]
value: [late \n lee] [Jim Kent]
--------
section2.id value: 250
section2.arrint value: [1 2 3]
section2.arrstr value: [apple apple2 apple3]
新生成的文件output.ini
内容:
name = foobar
# ini 测试样例
[section1]
sec1 = 110 210 ddd 99 | 133 135 1 2 1588 1509 | 310-410
sec2 = late \n lee | Jim Kent
[section2]
id = 250
arrint = 1 | 2 | 3
arrstr = apple, apple2, apple3
[info]
appVer = 1.3
author = Late Lee
除了维护有一定历史的工程外用到ini外,笔者一般会选择其它格式,因此测试代码较简单。就目前看,主要还是yaml。考虑到兼容性,也会用到xml。