Go利用反射实现一个ini文件的解析器程序

package main

import (
	"bufio"  // 逐行读取配置文件
	"fmt"
	"log"
	"os"
	"reflect"
	"strconv"
	"strings"
)

type Config struct {	// 定义配置结构体
	Section1 Section1 `ini:"section1"`	// 嵌套结构体1
	Section2 Section2 `ini:"section2"`	// 嵌套结构体2
}

type Section1 struct {
	Key1 string `ini:"key1"`
	Key2 int    `ini:"key2"`
}

type Section2 struct {
	Key3 float64 `ini:"key3"`
	Key4 bool    `ini:"key4"`
}

// fieldName 函数返回一个匹配函数,用于在结构体中查找字段名与给定字段名相同的字段
func fieldName(fieldName string) func(string) bool {
	return func(tag string) bool {
		return strings.EqualFold(tag, fieldName)	// 调用strings.EqualFold 函数进行不区分大小写匹配
	}
}

func main() {
	file, err := os.Open("config.ini")
	if err != nil {
		log.Fatalf("Failed to open file: %v", err)
	}
	defer file.Close()

	cfg := Config{}
	scanner := bufio.NewScanner(file)
	currentSection := ""
	v := reflect.ValueOf(&cfg).Elem()

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

		if line == "" || strings.HasPrefix(line, "#") {
			continue
		}

		if strings.HasPrefix(line, "[") && strings.HasSuffix(line, "]") {
			currentSection = strings.Trim(line, "[]")
			sectionField := v.FieldByNameFunc(fieldName(currentSection))
			if !sectionField.IsValid() {
				log.Printf("Invalid section: %s", currentSection)
			}
		} else {
			parts := strings.SplitN(line, "=", 2)
			if len(parts) != 2 {
				log.Printf("Invalid key-value pair: %s", line)
				continue
			}

			key := strings.TrimSpace(parts[0])
			value := strings.TrimSpace(parts[1])

			if currentSection == "" {
				log.Printf("Key-value pair found outside of any section: %s", line)
				continue
			}

			sectionField := v.FieldByNameFunc(fieldName(currentSection))
			if !sectionField.IsValid() {
				log.Printf("Invalid section: %s", currentSection)
				continue
			}

			field := sectionField.FieldByNameFunc(fieldName(key))
			if !field.IsValid() {
				log.Printf("Invalid key: %s", key)
				continue
			}

			switch field.Kind() {
			case reflect.String:
				field.SetString(value)
			case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
				intValue, err := strconv.ParseInt(value, 10, 64)
				if err != nil {
					log.Printf("Failed to parse int value for key %s: %v", key, err)
					continue
				}
				field.SetInt(intValue)
			case reflect.Float32, reflect.Float64:
				floatValue, err := strconv.ParseFloat(value, 64)
				if err != nil {
					log.Printf("Failed to parse float value for key %s: %v", key, err)
					continue
				}
				field.SetFloat(floatValue)
			case reflect.Bool:
				boolValue, err := strconv.ParseBool(value)
				if err != nil {
					log.Printf("Failed to parse bool value for key %s: %v", key, err)
					continue
				}
				field.SetBool(boolValue)
			default:
				log.Printf("Unsupported field type for key %s", key)
			}
		}
	}

	if err := scanner.Err(); err != nil {
		log.Fatalf("Error while scanning file: %v", err)
	}

	fmt.Printf("%+v\n", cfg)
}
[Section1]
key1 = value1
key2 = 100

[Section2]
key3 = 3.14
key4 = true

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/139288.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAP系统供应商预付款请求和预付账款业务

最近搞清帐! 在SAP中处理客户或供应商的预收/预付款相关业务流程操作说明, 首先由业务部门(销售或采购)下达销售/采购订单,同时基于订单提交预收/预付申请,客户/供应商款项到账时,由财务部门在SAP中勾选申请单来收付款;最后在财务转应收/应付转发票时自动核销。预付…

立体库堆垛机水平电机输出控制程序功能

###############水平电机输出控制程序################# #############水平变频器输出控制程序################# *******************水平速度曲线建立*********************** 列距离差值,建立与速度的关系式:VX/k MW220为K系数 水平速度控制K系数 列…

RK3568驱动指南|第七期-设备树-第66章of操作函数实验:获取设备树节点

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

圆形承重钢管用在线直线度测量仪实时检测品质!

关于直线度尺寸的检测,相信你听说过很多诸如直线法、直尺法、激光准直法等的离线检测方式,那你听说过在线直线度测量仪吗?它是可安装在产线上进行实时在线检测的设备。本文就跟随小编一起来简单的了解一下。 在线直线度测量仪的测量方法 直…

Notepad++,搜索窗口独立后,恢复

双击一下find result框,恢复到原来的模式。

使用cmd运行控制面板工具

如何通过键入命令运行“控制面板”工具 - Microsoft 支持 windows自带管理工具(exe/cpl/msc)-CSDN博客 CMD下打开系统各面板_cmd打开轻松使用面板-CSDN博客 示例: rundll32.exe shell32.dll,Control_RunDLL powercfg.cpl 替换powercfg.…

光计算1周2篇Nature,英伟达的时代彻底结束!

近期,光计算领域连续发出重量级文章,刊登在学术界的顶级期刊上。一时间,各大媒体纷纷转发,读者们也纷纷感叹:中国芯片取代英伟达的机会来了!今天,光子盒用这篇万字长文为大家梳理光计算的背景、…

FL Studio最新版本号21.2发行更新啦

Image Line宣布发布FL Studio 21.2。更新带来了许多改进,但主要功能是引入了新的词干分离功能和FL Cloud,这是一个新的在线平台,直接与DAW集成,为用户提供从循环和样本到母带和发行功能的一切。 词干分离与FL云 随着最新更新的发…

记一次线上问题引发的对 Mysql 锁机制分析

背景 最近双十一开门红期间组内出现了一次因 Mysql 死锁导致的线上问题,当时从监控可以看到数据库活跃连接数飙升,导致应用层数据库连接池被打满,后续所有请求都因获取不到连接而失败 整体业务代码精简逻辑如下: Transaction p…

DP4301-M无线模块一款SUB-1G无线收发模块

DP4301-M无线模块是一款低成本高效率工作于1GHz以内的收发模块,支持中国智能电无线 集抄标准470MHz~ 510MHz,兼容433MHz ISM/SRD频段均可使用。 此模块且前已经超大量应用于国标智能无线抄表及物联网自组网等双向数据传输系统方案,模 块具备的…

ADFS 高可用配置 + NLB配置(Windows网络负载均衡)

ADFS 高可用配置 NLB配置(Windows网络负载均衡) ADFS安装配置NLB配置节点 TEST-ADFS-01 网络负载平衡配置节点 TEST-ADFS-02 网络负载平衡修改CRM配置 ADFS实现高可用负载均衡有两种,主要是在数据库的选择方式: windows自带的内…

力扣第647题 回文子串 c++ 动态规划 双指针 附Java代码 注释解释版

题目 647. 回文子串 中等 相关标签 字符串 动态规划 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串…

数字化转型二

参考一华为数字化转型之道 企业做好数字化转型要有战略决心,要有信心,还要有恒心。顶层设计很重要,行动力也同样重要,转型不是画出来的,而是干出来的,遇到问题就要快速调整。方向大致正确下,组织…

家长群如何发成绩?

老师们是否经常被家长们追问:“老师,我孩子的成绩出来了吗?”、“老师,我孩子考了多少分?”等等。要想解决这个问题,看完这篇文章你就可以让家长们能够自助查询孩子的成绩了。 一、什么是成绩查询系统&…

windows aseprite编译指南(白嫖)

aseprite是画像素图的专业软件,steam上有售卖,不过官方也在github开源了,需要自己编译。 1. 首先获取源码 直接在github上clone源码到本地指定目录 git.bash中执行(需要腾一个用来安放源码的路径): git…

Code Former安装及使用

Code Former是南洋理工大学和商汤科技联合研究中心联合开发一款AI人脸修复算法,通过该算法,可以对已经模糊的图片进行人脸修复,找回斑驳的记忆 由于网上对于Code Former的封装,全都是要花钱,或者需要其他什么曲折的方式…

【PyTorch教程】如何使用PyTorch分布式并行模块DistributedDataParallel(DDP)进行多卡训练

本期目录 1. 导入核心库2. 初始化分布式进程组3. 包装模型4. 分发输入数据5. 保存模型参数6. 运行分布式训练7. DDP完整训练代码 本章的重点是学习如何使用 PyTorch 中的 Distributed Data Parallel (DDP) 库进行高效的分布式并行训练。以提高模型的训练速度。 1. 导入核心库 D…

23种设计模式 - 模板方法模式

1. 认识模板方法模式 1.1 模式定义 定义一个操作算法中的框架,而将这些步骤延迟加载到子类中。 它的本质就是固定算法框架。 1.2 解决何种问题 让父类控制子类方法的调用顺序 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 1.3…

基于springboot实现福聚苑社区团购平台系统项目【项目源码】计算机毕业设计

基于springboot实现福聚苑社区团购平台系统演示 Javar技术 Java是一种网络脚本语言,广泛运用于web应用开发,可以用来添加网页的格式动态效果,该语言不用进行预编译就直接运行,可以直接嵌入HTML语言中,写成js语言&…

最新有效rtsp/rtmp/hls地址长期维护

✍️作者简介:沫小北/码农小北(专注于Android、Web、TCP/IP等技术方向) 🐳博客主页:沫小北/码农小北 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN 🔔如果文章对您有一定的帮助请&…
最新文章