文档章节

golang实现ConfigParser, 解析ini

疯狂的小企鹅
 疯狂的小企鹅
发布于 2016/10/22 17:56
字数 321
阅读 97
收藏 0

Usage:

  • Init(rc_file1, rc_file2...) 后面的会覆盖前面的
  • Get(section)

在配置文件中可以使用COMMENT_FLAG 默认 #来写注解.

package config

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"regexp"
	"strings"
)

var CONFIG map[string]map[string]string = make(map[string]map[string]string)

const COMMENT_FLAG = "#"

var RE_SESSION *regexp.Regexp = regexp.MustCompile("^\\[.+\\]$")
var RE_KV *regexp.Regexp = regexp.MustCompile("^.+\\=.+$")

func exists(file string) bool {
	if f, err := os.Open(file); err != nil && os.IsNotExist(err) {
		defer f.Close()
		return false

	}
	return true
}

func parse_line(line string) (string, interface{}) {
	comment_index := strings.Index(line, COMMENT_FLAG)
	if comment_index != -1 {
		line = line[0:comment_index]
	}
	if RE_SESSION.MatchString(line) {
		return "section", line[1 : len(line)-1]
	}

	if RE_KV.MatchString(line) {
		parts := strings.SplitN(line, "=", 2)
		return "kv", map[string]string{strings.TrimSpace(parts[0]): strings.TrimSpace(parts[1])}
	}

	fmt.Fprintf(os.Stderr, "%s format error!\n", line)
	return "other", nil
}

func Get(section string) (map[string]string, error) {
	config, ok := CONFIG[section]
	if ok {
		return config, nil
	}
	return nil, fmt.Errorf("section %s not found", section)
}

func Sections() (sections []string) {
	for section, _ := range CONFIG {
		sections = append(sections, section)
	}
	return sections
}

func parse_rc_content(content string) map[string]map[string]string {
	config := make(map[string]map[string]string)
	lines := strings.FieldsFunc(content, func(char rune) bool {
		return strings.ContainsRune("\r\n", char)
	})

	last_section := ""

	for _, line := range lines {
		line = strings.TrimSpace(line)
		if line == "" {
			continue
		}
		line_type, line_value := parse_line(line)
		switch {
		case line_type == "section":
			section := line_value.(string)
			if _, ok := config[section]; ok == false {
				config[section] = make(map[string]string)
			}
			last_section = section

		case line_type == "kv" && last_section != "":
			kv := line_value.(map[string]string)
			for k, v := range kv {
				config[last_section][k] = v
			}
		}
	}

	return config
}

func Init(rc_files ...string) {
	for _, rc_file := range rc_files {
		if !exists(rc_file) {
			continue
		}
		content_bytes, err := ioutil.ReadFile(rc_file)
		if err != nil {
			log.Fatalln(err)
		}
		content := string(content_bytes)
		for section, configs := range parse_rc_content(content) {
			_, ok := CONFIG[section]
			if ok == false {
				CONFIG[section] = make(map[string]string)
			}
			for name, value := range configs {
				CONFIG[section][name] = value
			}
		}
	}
}

© 著作权归作者所有

疯狂的小企鹅

疯狂的小企鹅

粉丝 14
博文 42
码字总数 20243
作品 6
杭州
程序员
私信 提问
Java中使用ini格式配置文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 马哥私房菜的github地址 https://github.com/mageSFC/myblog https://blog.csdn.net/mmh19891113/article/details/82079977 ini格式配...

马哥私房菜
2018/08/26
0
0
Python 解析配置模块之ConfigParser详解

1.基本的读取配置文件 -read(filename) 直接读取ini文件内容 -sections() 得到所有的section,并以列表的形式返回 -options(section) 得到该section的所有option -items(section) 得到该sec...

科技小能手
2017/11/12
0
0
python ConfigParser – 配置文件解析(转载)

ConfigParser – 配置文件解析 该模块定义了ConfigParser类,该类实现了基本的配置文件的解析,配置文件提供了类似与WINDOWS下的INI文件结构。你可以使用该类编写最终用户很容易自定义的Pyt...

杨俊生
2012/07/13
867
0
python模块之configparser

configparser configParser 模块用于操作配置文件 注:Parser汉译为“解析”之意。 配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值或...

SA_小科
2018/01/12
0
0
Python ConfigParser的使用 【转载】

1.基本的读取配置文件 -read(filename) 直接读取ini文件内容 -sections() 得到所有的section,并以列表的形式返回 -options(section) 得到该section的所有option -items(section) 得到该sec...

杨俊生
2012/07/13
103
0

没有更多内容

加载失败,请刷新页面

加载更多

官方来源的 Duo Mobile App 解决了我的 Network Difficulties 问题

https://help.duo.com/s/article/2094?language=en_US 我利用百度搜索下载了一个 Duo Mobile App (由于 Google Play)在大陆不可用。 在扫描旧手机上的 Duo Mobile App 的二维码时, 显示出错...

圣洁之子
8分钟前
1
0
Zabbix监控Mysql容器(Docker容器)主从是否存活

1、在Zabbix Web端创建模板 2、为该模板创建监控项 3、创建触发器 4、在zabbix-agent端操作 在/etc/zabbix/zabbix_agentd.d新建customize.confw文件 内容如下 UserParameter=mysql.replicat...

abowu
9分钟前
1
0
基于 RocketMQ 的同城双活架构在美菜网的挑战与实践

本文整理自李样兵在北京站 RocketMQ meetup分享美菜网使用 RocketMQ 过程中的一些心得和经验,偏重于实践。 嘉宾李样兵,现就职于美菜网基础服务平台组,负责 MQ ,配置中心和任务调度等基础...

大涛学长
15分钟前
1
0
设计模式之:外观模式和桥接模式

作者:DevYK 链接:https://juejin.im/post/5d7e01f4f265da03b5747aac 外观模式 介绍 外观模式 (Facade) 在开发过程中的运用评率非常高,尤其是在现阶段,各种第三方 SDK “充斥” 在我们周边...

Java架构Monster
16分钟前
1
0
人证合一核验设备

人脸身份验证机,人证合一设备1:N如我们现在在车站或一些重要的场所如步行街、城中村等人流密集的场所应用的人脸识别布控系统,其特点是动态和非配合。所谓的动态也就是识别的不是照 片,不是...

非思丸智能
18分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部