# go-ini
**Repository Path**: fnet/go-ini
## Basic Information
- **Project Name**: go-ini
- **Description**: 项目从 gstart/go-ini 仓库分支独立, 实现简单,轻量级的 go版本ini文件解析库
- **Primary Language**: Go
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 2
- **Created**: 2017-11-04
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# go ini 文件解析库
* AUTHOR = Joshua Conero
* VERSION = 0.1.0
* NAME = go ini 文件解析库
* START = 2017-01-19
* COPYRIGHT = @Conero
## 来源
- 2017年3月18日 星期六
- 从原 console 仓库独立出来
### 全解析模型
- 对应函数: FullParse
- 数据模型: 树形图
- 与go结合对象: 基础 Map
Map -> [string]interface{}
Map -> [string]string string
Map -> [string]Array array
Map -> Map[string]interface{}
- 设想法:
1. 生成单个 Map 值, 再于基级结合 主要问题: 多级Map自己无法与基基对象相链接
2. 先解析所有数据对象,再根据级别组合
## 严重错误记录
### 2017年3月22日 星期三
- 逐行读取进入死循环: 在 ini 文件最后一行为注释行/获取持续空行时 程序进入死循环
- 原函数代码如下
// 解析文本
func (c *Conf) Parse() (int, map[string]interface{}) {
var status int = 0
paserData = make(map[string]interface{})
seekCount := 0
lineCount := 0
if c.filename != "" {
c.mtime = time.Now()
// 逐行读取文件
fh, err := os.Open(c.filename)
multiLine := false // 多行注释开启
if err == nil {
buf := bufio.NewReader(fh)
for {
line, err := buf.ReadString('\n')
line = strings.TrimSpace(line)
lineCount = lineCount + 1
// 多行注释开始
if line == ">>>" {
multiLine = true
} else if line == "<<<" { // 注释结束
multiLine = false
continue
}
// 循环跳出
if line == "" || strings.Index(line, "#") == 0 || multiLine { // # 字符换跳过
continue
}
key := ""
// 模式一 key = v1 , v2 , v3 ; key = v
eqSigner := regexp.MustCompile(`=+`)
if eqSigner.Match([]byte(line)) {
// 删除行之间的所有空格
kbSinger := regexp.MustCompile(`\s`)
line = string(kbSinger.ReplaceAll([]byte(line), []byte("")))
strLen := strings.Index(line, "=")
key = line[0:strLen]
line = strings.TrimSpace(line[strLen+1:])
line = Render(line)
if strings.Index(line, ",") > -1 {
paserData[key] = strings.Split(line, ",")
} else {
paserData[key] = line
}
} else {
// 模式二 key v1 v2 v3; key v
strLen := strings.Index(line, " ")
key = line[0:strLen]
line = strings.TrimSpace(line[strLen+1:])
line = Render(line)
// 删除多空格
mkbSinger := regexp.MustCompile(`[\s]{2:}`)
if mkbSinger.Match([]byte(line)) {
line = string(mkbSinger.ReplaceAll([]byte(line), []byte("")))
}
if strings.Index(line, " ") > -1 {
paserData[key] = strings.Split(line, " ")
} else {
paserData[key] = line
}
}
seekCount = seekCount + 1
if err != nil {
break
}
}
c.seekCount = seekCount
c.lineCount = lineCount
c.endtime = time.Now()
}
status = 1
}
return status, paserData
}
- 修改方式: 逐行读取时优先检测错误性
## 版本更新以及说明
### V 0.1.4 (2017年3月22日 星期三)
* 逐行读取进入死循环: 在 ini 文件最后一行为注释行/获取持续空行时 程序进入死循环
### V 0.1.6 (2017年3月23日 星期四)
* 移除全局变量 parseData 等变量,使库支持"多进程"调用, 即对象与全局变量分离
* 其他程序修复
* (类似 / alpha 版)
### V 0.2.1 (2017年3月29日 星期三)
* 版本优化,将解析符号变为可设置常量(内嵌代码中)
* 结构优化,将代码移入 src 中
* 重复服务版本号的意义: V a.b.c =>
a 有标志性改变时增加版本号 版本号增加
b 功能性代码改变 版本号增加
c 代码提交带git/且有记录是 版本号增加
* 实现作用域功能
* 新增 ini -> json 字符换改变
* 新增版本对应号
### V 0.2.2 (2017年3月30日 星期四)
* 新增全局的 ToJson 函数用于实现 map[string]interface{} -> Json 字符串
* Conf.ToJson 具体实现
* Conf.Parse 解析程序调试以及优化, 实现二级作用域对象生成, 以及 {} 相关语法的测试以及生成
* 对应引入的 common 库 进行标准化
### V 0.2.3 (2017年3月31日 星期四)
* 全级解析分析模型

* 代码优化
* 新增全解析功能,保留远普通解析法
* 全解析规范化处理以及模型分析
* 代码代实现
### V 0.2.4 (2017年4月5日 星期三)
* full-parse 全解析设计与实现;根据设计的方法优化程序,以及相应的测试
* 功能待实现
### V 0.2.5 (2017年4月6日 星期四)
* full-parse 全解析设计与实现: 设计模型更变,降低维度; 即改变原来的二维模型为一维模型,重构代码.
* 功能待实现
### V 0.2.6 (2017年4月8日 星期六)
* full-parse 全解析设计与实现: 代码调试~以及功能待实现 / 二级解析成功; 多级需继续实现
* 未能实现想要的结果,全解析实现失败
* ToJson 修复,适应在full-parse中新增的自定义类型(等待全局性统一)
### V 0.2.7 (2017年4月10日 星期一)
#### full-parse 全解析设计与实现:
* 代码调试,以及功能实现(进行中);相对应上一版本,解析过程中多级键名基本与实际相对应, 但是出现值覆盖于丢失对bug
* 现在根据最佳值命中的法则来实现值与级数匹配
### V 0.2.8 (2017年4月13日 星期四)
#### full-parse 全解析设计与实现:
* 代码修复, 可实现简单的多级 全解析 如:
lily = {
test = {
test = {
test = {
test = {
like = Emma
toll = Emma
lastname = wang
}
}
}
}
}
"lily":{
"test":{
"test":{
"test":{
"test":{
"toll":"Emma",
"lastname":"wang",
"like":"Emma"
}
}
}
}
}
* 新增 func (c *Conf) ValueType(dt map[string]interface{}, key string) (bool, string, interface{}) 获取值类型
* vMapLinkArr full-parse 内部方法 Map-Arr 链接器设计,未测试
### V 0.2.9 (2017年4月18日 星期二)
* 全解析解析模型改造,将原来的 VMap 改造为 vMap 将 stackMap
* 新模型实现全解析功能
* 代码优化
* 下版本将分支为 0.3.0
### V 0.3.0 (2017年4月24日 星期一)
* 第三版本规划以及相关设计, 重构测试用例。0.2.x 版本分离
* alpha 版
* 以及其他优化
### V 1.0.0 (2017年10月28日 星期六)
* 重写规划和设计 golang-ini
* [详情](./ini-goV1.x.md)