以下是《Go语言100个实战案例》中的文件与IO操作篇 - 案例20:简单配置文件(INI格式)解析器的完整内容,适合入门学习如何用 Go 语言解析常见的 .ini 配置文件格式。
🎯 案例目标
使用 Go 语言解析一个 .ini 格式的配置文件,提取其中的键值对,并按 section 分类存储。
🧩 应用场景
- • 开发需要加载外部配置(如数据库、服务端口等)的小工具或服务
- • 学习如何读取和解析结构化文本
- • 简易配置系统的实现
🧠 涉及知识点
- • 文件读取与按行解析
- • 字符串处理:去空格、分割、前缀判断
- • map[string]map[string]string 多层结构
- • 处理注释和空行
🗂️ 示例配置文件(config.ini)# 系统配置[server]host = 127.0.0.1port = 8080[database]user = rootpassword = 123456dbname = testdb
💻 示例代码:简单 INI 文件解析器packagemainimport("bufio""fmt""os""strings")funcparseINI(filePathstring) (map[string]map[string]string,error) { config :=make(map[string]map[string]string)varcurrentSectionstringfile, err := os.Open(filePath)iferr !=nil{returnnil, err }deferfile.Close scanner := bufio.NewScanner(file)forscanner.Scan { line := strings.TrimSpace(scanner.Text)// 忽略注释和空行ifline ==""|| strings.HasPrefix(line,"#") || strings.HasPrefix(line,";") {continue}// 处理 sectionifstrings.HasPrefix(line,"[") && strings.HasSuffix(line,"]") { currentSection = strings.TrimSpace(line[1:len(line)-1]) config[currentSection] =make(map[string]string) }else{// 处理 key=valueparts := strings.SplitN(line,"=",2)iflen(parts) ==2&& currentSection !=""{ key := strings.TrimSpace(parts[0]) value := strings.TrimSpace(parts[1]) config[currentSection][key] = value } } }iferr := scanner.Err; err !=nil{returnnil, err }returnconfig,nil}funcmain { iniPath :="config.ini"config, err := parseINI(iniPath)iferr !=nil{ fmt.Println("解析失败:", err)return}// 打印解析结果forsection, kv :=rangeconfig { fmt.Println("["+ section +"]")forkey, value :=rangekv { fmt.Printf("%s = %s\n", key, value) } fmt.Println }}
📤 执行输出示例[server]host = 127.0.0.1port = 8080[database]user = rootpassword = 123456dbname = testdb
🛠 技术说明
- 功能
- 用法
- 去除空格strings.TrimSpace
- 判断开头结尾strings.HasPrefix, strings.HasSuffix
- 分割键值对strings.SplitN(str, "=", 2)
- 多层 map 存储结构map[section]map[key]value
🧪 拓展练习
- • 支持注释中 # 和 ; 的双重格式
- • 支持值为数字、布尔值的自动识别与转换
- • 将解析结果导出为 JSON 文件
- • 写一个配置查询函数:传入 section 和 key,返回 value
✅ 小结
通过本案例,你掌握了如何读取 .ini 配置文件并将其解析为结构化数据,是很多服务启动时加载配置的基础实践。