go通过ini文件读写实现“小数据库”

本文主要是介绍了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”:

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值