本文主要是介绍了go对INI文件内容及section的读、写、修改,删除操作,若真要使用ini文件来做“小数据库”或者队列,还是有一定的弊端的,比如效率是相对较低的,还有就是不适用多节点环境,只适合单节点环境,并且对该ini文件存在依赖,如果环境A上的ini文件存在增加、修改和删除操作,现在要将服务迁移到环境B上,那么就得先去环境A上将ini文件下载下来上传到代码仓重新出包,再到环境B上安装部署,才要保证环境B下的ini文件继承了环境A上的。
代码实现如下:
var cfg *ini.File
func main() {
var err error
// 加载ini文件
cfg, err = ini.Load("test.ini")
if err != nil {
fmt.Println("[ReadLogId] fail to parse 'test.ini':", err)
}
// 增
fmt.Println(Add("w77"))
// 删
fmt.Println(Del("w55"))
// 改,将“w66”改成“w661”
fmt.Println(Update("w66", "w661"))
// 查
fmt.Println(Grep("w44"))
}
// 判断是否存在
func Add(key string) (bool, error) {
ret, num := Exist(key)
// 错误
if !ret && num == 0 {
return false, err.New("[Add] failed")
}
// 存在
if ret {
return false, err.New("[Add] Exist")
}
// 不存在
section, err := cfg.GetSection("test")
if err != nil {
fmt.Println("[Add] GetSection failed:", err)
}
section.NewKey(key, strconv.Itoa(num))
err = cfg.SaveTo("test.ini")
if err != nil {
fmt.Println("[Add] SaveTo failed:", err)
}
return true, nil
}
func Del(key string) (bool, error) {
ret, num := Exist(key)
// 错误
if !ret && num == 0 {
return false, err.New("[Del] failed")
}
// 不存在
if !ret {
return false, err.New("[Add] Not Exist")
}
// 存在
section, err := cfg.GetSection("test")
if err != nil {
fmt.Println("[Add] GetSection failed:", err)
}
section.DeleteKey(key)
err = cfg.SaveTo("test.ini")
if err != nil {
fmt.Println("[Add] SaveTo failed:", err)
}
return true, nil
}
func Update(key string, newKey string) (bool, error) {
ret, num := Exist(key)
// 错误
if !ret && num == 0 {
return false, err.New("[Del] failed")
}
// 不存在
if !ret {
return false, err.New("[Add] Not Exist")
}
// 存在
section, err := cfg.GetSection("test")
if err != nil {
fmt.Println("[Add] GetSection failed:", err)
}
re, err := Del(key)
if !re {
fmt.Println("[Add] Del failed:", err)
}
section.NewKey(newKey, strconv.Itoa(num))
err = cfg.SaveTo("test.ini")
if err != nil {
fmt.Println("[Add] SaveTo failed:", err)
}
return true, nil
}
func Grep(key string) (string, error) {
// 读取“test”分段下的“key”对应的值
ret := cfg.Section("test").Key(key)
if len(ret.Value()) == 0 {
return "", err.New("[Grep] Not Exist")
}
return ret.Value(), nil
}
func Exist(key string) (bool, int) {
// 读取“test”分段下的“key”对应的值
ret := cfg.Section("test").Key(key)
// 不存在“key”对应的值
if len(ret.Value()) == 0 {
num := 1
for {
ret := cfg.Section("test").HasValue(strconv.Itoa(num))
if ret {
num++
} else {
return false, num
}
}
}
// 存在“key”对应的值
value, err1 := strconv.Atoi(ret.Value())
if err1 != nil {
return false, 0
}
return true, value
}
INI文件:
[test]
# value = key
w11 = 1
w22 = 2
w33 = 3
w44 = 4
w55 = 5
w66 = 6
1、执行Add操作,ini文件增加“w77”:
2、执行Del操作,ini文件删掉了“w55”:
3、执行Update操作,ini文件将“w66”改成“w661”: