Go语言实战案例-简单配置文件(INI格式)解析器

以下是《Go语言100个实战案例》中的 文件与IO操作篇 - 案例20:简单配置文件(INI格式)解析器 的完整内容,适合入门学习如何用 Go 语言解析常见的 .ini 配置文件格式。


🎯 案例目标

使用 Go 语言解析一个 .ini 格式的配置文件,提取其中的键值对,并按 section 分类存储。


🧩 应用场景

  • • 开发需要加载外部配置(如数据库、服务端口等)的小工具或服务
  • • 学习如何读取和解析结构化文本
  • • 简易配置系统的实现

🧠 涉及知识点

  • • 文件读取与按行解析
  • • 字符串处理:去空格、分割、前缀判断
  • map[string]map[string]string 多层结构
  • • 处理注释和空行

🗂️ 示例配置文件(config.ini)

ini 复制代码
# 系统配置
[server]
host = 127.0.0.1
port = 8080

[database]
user = root
password = 123456
dbname = testdb

💻 示例代码:简单 INI 文件解析器

go 复制代码
package main

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

func parseINI(filePath string) (map[string]map[string]string, error) {
    config := make(map[string]map[string]string)
    var currentSection string

    file, err := os.Open(filePath)
    if err != nil {
        return nil, err
    }
    defer file.Close()

    scanner := bufio.NewScanner(file)

    for scanner.Scan() {
        line := strings.TrimSpace(scanner.Text())

        // 忽略注释和空行
        if line == "" || strings.HasPrefix(line, "#") || strings.HasPrefix(line, ";") {
            continue
        }

        // 处理 section
        if strings.HasPrefix(line, "[") && strings.HasSuffix(line, "]") {
            currentSection = strings.TrimSpace(line[1 : len(line)-1])
            config[currentSection] = make(map[string]string)
        } else {
            // 处理 key=value
            parts := strings.SplitN(line, "=", 2)
            if len(parts) == 2 && currentSection != "" {
                key := strings.TrimSpace(parts[0])
                value := strings.TrimSpace(parts[1])
                config[currentSection][key] = value
            }
        }
    }

    if err := scanner.Err(); err != nil {
        return nil, err
    }

    return config, nil
}

func main() {
    iniPath := "config.ini"
    config, err := parseINI(iniPath)
    if err != nil {
        fmt.Println("解析失败:", err)
        return
    }

    // 打印解析结果
    for section, kv := range config {
        fmt.Println("[" + section + "]")
        for key, value := range kv {
            fmt.Printf("%s = %s\n", key, value)
        }
        fmt.Println()
    }
}

📤 执行输出示例

ini 复制代码
[server]
host = 127.0.0.1
port = 8080

[database]
user = root
password = 123456
dbname = testdb

🛠 技术说明

功能 用法
去除空格 strings.TrimSpace()
判断开头结尾 strings.HasPrefix(), strings.HasSuffix()
分割键值对 strings.SplitN(str, "=", 2)
多层 map 存储结构 map[section]map[key]value

🧪 拓展练习

  • • 支持注释中 #; 的双重格式
  • • 支持值为数字、布尔值的自动识别与转换
  • • 将解析结果导出为 JSON 文件
  • • 写一个配置查询函数:传入 section 和 key,返回 value

✅ 小结

通过本案例,你掌握了如何读取 .ini 配置文件并将其解析为结构化数据,是很多服务启动时加载配置的基础实践。


相关推荐
陈随易42 分钟前
阿里千问3发布最强AI编程模型Coder,能力堪比Claude 4,1M上下文
前端·后端·程序员
生无谓1 小时前
ThreadLocal的使用
后端
Java水解1 小时前
美团Java面试题、笔试题(含答案)
java·后端·面试
狗头大军之江苏分军1 小时前
我依然“瞧不起”努力的人,更讨厌歌颂努力的人
前端·后端
一只叫煤球的猫2 小时前
这些 Spring Boot 默认配置不改,迟早踩坑
java·spring boot·后端
段清雅2 小时前
Go语言的区块链
开发语言·后端·golang
onejason2 小时前
Java 爬虫实战指南:获取淘宝商品详情
java·前端·后端
雷渊2 小时前
LangChain4j-ChatModel、EmbeddingModel、ImageModel、ModerationModel、ScoringModel的区别?
后端·llm
码出极致2 小时前
java实现高并发场景下三级缓存的数据一致性
后端
南雨北斗3 小时前
Apache环境下SSL证书合并顺序
后端