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

1,167 阅读3分钟

「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

生命不息,学习不止

题外话

下班到家,打开我这999纯金视网膜扫描认证大门,就看到我的宠物大萝卜向我奔来,大萝卜只是一直简简单单的纯白西伯利亚虎而已,哎,又是乏味的一天…… 养个宠物就是这么简简单单 话说今天是双十一,更冷了(一个人的寂寞,不知道是谁的错……)

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

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]块中键名,我们通过这个键名获取到我们想要的值。

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

在这里插入图片描述

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