Go语言从INI配置文件中读取需要的值

题外话

清晨第一缕阳光打在我的脸上,我从我席梦思床垫上爬起,拿起我的iPhone56,定了一份加了三斤可食用金粉的麻辣烫,哎,又是乏味的一个早上…… 人生就是这么简简单单
话说今天的风是真的大,是真冷啊

在这里插入图片描述
废话不多说,上货
在这里插入图片描述

INI配置文件

.ini 文件是Initialization File的缩写,即初始化文件,是windows的系统配置文件所采用的存储格式,统管windows的各项配置,一般用户就用windows提供的各项图形化管理界面就可实现相同的配置了。但在某些情况,还是要直接编辑ini才方便,一般只有很熟悉windows才能去直接编辑。
举个例子
在这里插入图片描述
在这里插入图片描述
ini的文件格式就长这样,一般用于操作系统、虚幻游戏引擎、GIT 版本管理中,这种配置文件的文件扩展名为.ini。
INI 文件由多行文本组成,整个配置由[ ]拆分为多个“段”(section)。每个段中又以=分割为“键”和“值”。
INI 文件以;置于行首视为注释,注释后将不会被处理和识别
上图第一行就是注释

从 INI 文件中取值

我们创建一个 woner.ini 文件,将上方内容复制到该文件中。
内容如下

; for 16-bit app support
[fonts]
[extensions]
[mci extensions]
[files]
[Mail]
MAPI=1
CMCDLLNAME32=mapi32.dll
CMC=1
MAPIX=1
MAPIXVER=1.0.0.1
OLEMessaging=1

准备好 woner.ini 文件后,下面我们开始尝试读取该 INI 文件,并从文件中获取需要的数据,
我们的目的是获取CMCDLLNAME32=mapi32.dll这行的 mapi32.dll
完整的示例代码如下所示:

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

// 根据文件名,段名,键名获取ini的值
func getValue(filename, expectSection, expectKey string) string {
	// 打开文件
	file, err := os.Open(filename)
	// 文件找不到,返回空
	if err != nil {
		return "123"
	}
	// 在函数结束时,关闭文件
	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 "123123"
}

func main() {
	fmt.Println(getValue("woner.ini", "Mail", "CMCDLLNAME32"))
}

保姆式注解让你一眼就能看懂
运行结果
在这里插入图片描述

getValue() 函数

本例并不是将整个 INI 文件读取保存后再获取需要的字段数据并返回,这里使用 getValue() 函数,每次从指定文件中找到需要的段(Section)及键(Key)对应的值。

getValue() 函数的声明如下:
func getValue(filename, expectSection, expectKey string) string

参数说明如下。
filename:INI 文件的文件名。
expectSection:期望读取的段。
expectKey:期望读取段中的键。

你以为结束了

ini文件内容
; for 16-bit app support
[fonts]
[extensions]
[mci extensions]
[files]
[Mail]
MAPI=1
CMCDLLNAME32=mapi32.dll
CMC=1
MAPIX=1
MAPIXVER=1.0.0.1
OLEMessaging=1

fmt.Println(getValue("woner.ini", "Mail", "CMCDLLNAME32")) //调用函数

方法中第二个参数 “Mail” 对应的是ini文件中的[Mail]块,CMCDLLNAME32 表示 INI 文件中[Mail]块中键名,我们通过这个键名获取到我们想要的值。

小问题:如何通过键去修改值呢?

在这里插入图片描述
大家看完发现有什么错误,写在下面吧!跟我黑虎阿福比划比划!
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值