本文对 ini 文件进行解析。
概述
某Delphi项目需要做一些额外的配置,因为原本的配置文件是ini格式的,为不影响已有代码,而且delphi读取解析ini比较简单,考虑到兼容性,最终还是新建单独的ini配置文件并解析。为了对比数据一致性,除了Delphi工程外,还在另一golang工程实现相同的算法,所用的配置文件,完全相同。本文使用 Golang 解析 ini。
测试
github仓库在此下载:
go get /ini.v1
go mod vendor # 加入vendor
截取发文时,最新版本为v1.67.0
。
引入包,代码片段:
import (
ini "/ini.v1"
)
配置文件文件内容:
# 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"
"/ini.v1"
)
var (
cfgFile string = ""
)
func TestIni(t *) {
("test of ini...")
// 加载
cfg, err := (cfgFile)
if err != nil {
("Fail to read file: %v", err)
return
}
// 读一节
mySection := ("section1")
("keystrings:", ())
// 解析
for _, key := range () {
("key: [%v]\nvalue: ", key)
values := (key).Strings("|")
for _, item := range values {
("[%v] ", item)
}
("\n--------\n")
}
// 按单个字符串
strVlaue := ("section2").Key("id").Value()
(" value: %v\n", strVlaue)
// 数值,以"|"分隔
arrVlaueInt := ("section2").Key("arrint").ValidInts("|")
(" value: %v\n", arrVlaueInt)
// 字符串,以","分隔
arrVlaueStr := ("section2").Key("arrstr").Strings(",")
(" value: %v\n", arrVlaueStr)
// 写入ini
("").Key("name").SetValue("foobar")
("info").Key("appVer").SetValue("1.3")
("info").Key("author").SetValue("Late Lee")
// 另起文件
("")
}
输出结果:
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]
--------
value: 250
value: [1 2 3]
value: [apple apple2 apple3]
新生成的文件内容:
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。