2019独角兽企业重金招聘Python工程师标准>>>

目前,常用作配置文件的格式有多种多样,包括xml,yaml,json,ini等, 个人还是比较习惯使用ini,无论是读写都比较直观,还能有详细的注释。

本篇介绍一下怎么读取和使用ini格式的配置文件。

解释配置文件,读取配置项

为方便处理,配置读取后返回key,value字典表,key,value都是字符串,如有需要,使用时再进行类型转换。

每组key、value代表一个配置项。

var(confData  = make(map[string]map[string]string) //配置数据cMtime    int64                                //配置的最后读取的时间,初始化时为0,保证首次调用会读取
)
func LoadConf(files ...string) (map[string]string, error) {for _, file := range files { //遍历要读取的配置文件,支持多个f, err := os.Open(file)if err != nil {return nil, err  //如果配置文件打开出错,直接返回}defer f.Close()stat, _ := f.Stat()//判断文件是否有更新,文件的修改时间在上次读取之前,不重复读 if stat.ModTime().Unix() <= cMtime { continue}//读取文件内容,解释出配置项//配置项先按文件来分组保存,confData[f.Name()] = make(map[string]string) //重置当前文件的字典表,保证多次调用时不会出现脏数据buf := bufio.NewReader(f)section := ""for ln := 1; ; ln++ {line, err := buf.ReadBytes('\n')  //按行读文件内容if err != nil {if err != io.EOF { //读取失败且未到行尾,返回错误return nil, err} else if len(line) == 0 { // 已到行尾,且已没有读到内容,完成读取break}}line = bytes.TrimSpace(line)if line == nil || bytes.HasPrefix(line, bComment) { //空行或注释,跳过continue}if bytes.HasPrefix(line, bSectionStart) && bytes.HasSuffix(line, bSectionEnd) { //切换到新的sectionsection = strings.ToLower(string(line[1 : len(line)-1]))continue}keyValue := bytes.SplitN(line, bEqual, 2) //用"="分成key,value if len(keyValue) != 2 { //不符合key=value的格式,返回错误return nil, errors.New(fmt.Sprintf("Load conf file error: file=%s,line=%d", file, ln))}key := string(bytes.TrimSpace(keyValue[0]))if section != "" {key = section + "." + key  //key加上section作为完整的key}//val去掉空格,引号等,保存到字典中val := bytes.TrimSpace(keyValue[1])val = bytes.Trim(val, `"'`) confData[f.Name()][key] = string(val)}}cMtime = time.Now().Unix() //将当前时间设为最后读取时间//合并复制多个文件的值(相同的会覆盖)//不能直接使用,因为map为引用,修改读取的值会影响原始值(比如设置默认值)data := make(map[string]string)for _, d := range confData {for k, v := range d {data[k] = v}}return data, nil
}

框架中使用

  • 在服务启动时,先读入配置
func NewServer() *App{conf, err := LoadConf(confFile...) //confFile是配置文件数组//check errerr = checkConf(conf) //检查配置是否有问题,并为某些配置项设置缺省值//check errapp = &App{conf : conf//其它成员}return app
}func checkConf(conf){setConfDefault(conf, "listen", ":8080") //将listen的缺省值设为":8080",在配置中未有该项时使用缺省值if _,exists:= conf["log.path"];!exists{ //缺少必填的配置,报错return error.New("conf error: log.path is require")}//other....
}
//设置默认值,当conf[key]未设置时,将值设为val
func setConfDefault(conf map[string]string, key string, val string) {if _, exists := conf[key]; !exists {conf[key] = val}
}
//reload和载入时一样(有变化时,会实时加载新的配置项)
func (this *App) reload(){conf, err := LoadConf(confFile...)//check errerr = checkConf(conf)this.conf = conf
}
  • 在controller中使用
type Controller struct{*ecgo.App
}
func (this *Controller) Say(){path := this.conf["log.path"]sessPath,_ := this.conf["session.path"]
}

独立使用

因为配置读取是作为一个子包的方法提供,所以,也可以单独在你的项目中使用。

conf, err := LoadConf("a.ini","b.ini")
//check err
//conf保存了配置项,可以直接读取,如有需要,可根据exists是否为true来判断有没有该项配置
v1, exists := conf["key"] //exists为false时,v1="" 空串,如果空串的意义和没有配置的意义一样,可不判断exists
v2, exists := conf["section.key"]conf, _ = LoadConf("c.ini")
//此时,conf包括a,b,c三个文件的配置内容

转载于:https://my.oschina.net/tim8670/blog/638893

编写GO的WEB开发框架 (十三): 配置文件读取相关推荐

  1. JavaScript是如何工作的:编写自己的Web开发框架 + React及其虚拟DOM原理

    摘要: 深入JS系列19. 原文:JavaScript是如何工作的:编写自己的Web开发框架 + React及其虚拟DOM原理 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这是专门 ...

  2. javascript编写_如何通过编写自己的Web开发框架来提高JavaScript技能

    javascript编写 Have you ever asked yourself how a framework works? 您是否曾经问过自己框架是如何工作的? When I discovere ...

  3. Java开源Web开发框架

     WebWork WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EE Web框架.WebWork目前最新版本是2.1,现在的WebWork2.x前身 ...

  4. 【Python】 Web开发框架的基本概念与开发的准备工作

    Web框架基本概念 现在再来写这篇文章显然有些马后炮的意思.不过正是因为已经学习了Flask框架, 并且未来计划学习更加体系化的Django框架,在学习过程中碰到的很多术语等等,非常有必要通过这样一篇 ...

  5. Python Web开发框架Django

    花了两周时间,利用工作间隙时间,开发了一个基于Django的项目任务管理Web应用.项目计划的实时动态,可以方便地被项目成员查看(^_^又重复发明轮子了).从前台到后台,好好折腾了一把,用到:HTML ...

  6. KOA 2.0 新一代WEB开发框架-姜威-专题视频课程

    KOA 2.0 新一代WEB开发框架-231人已学习 课程介绍         koa 是由 Express 原班人马打造的,致力于成为一个更小.更富有表现力.更健壮的 Web 框架. 使用 koa ...

  7. python web开发框架flask_Python Web 开发框架,Flask 与 Django那个更好

    本文把 Flask 和 Django 做一个比对,因为我对这两个 Python Web 框架都有实际的开发经验.希望我可以帮助您选择学习哪个框架,因为学习一个框架可能会非常耗时 -- 当然也很有趣! ...

  8. 程序员新手第一个python web开发框架

    接下来正式进入网站的功能开发.要完成后台管理系统登录功能,通过查看登录页面,我们可以了解到,我们需要编写验证码图片获取接口和登录处理接口,然后在登录页面的HTML上编写AJAX. 在进行接口开发之前, ...

  9. 基于MVC4+EasyUI的Web开发框架经验总结(8)--实现Office文档的预览

    在博客园很多文章里面,曾经有一些介绍Office文档预览查看操作的,有些通过转为PDF进行查看,有些通过把它转换为Flash进行查看,但是过程都是曲线救国,真正能够简洁方便的实现Office文档的预览 ...

最新文章

  1. MSBuild + MSILInect实现编译时AOP-改变前后对比
  2. 在Service中通过WindowManger添加View的方式来把UI界面显示出来
  3. tomcat:Could not publish to the server. java.lang.IndexOutOfBoundsException
  4. SQL Server中 sysobjects、syscolumns、systypes
  5. 【java】java AQS AbstractQueuedSynchronizer 实现自定义锁以及相关简介
  6. 解决“访问 IIS 元数据库失败”的方法
  7. ad转3d视图快捷键_AD 常用快捷键
  8. 本地以图搜图识图工具——嗅图狗!(python3.6实现图像比对指路,代码git)
  9. SLAM论文写作经验 | 小白、跨专业、无人指导、一年多从零到发顶会,他如何做到?
  10. 如何快速区分单模与多模光纤收发器?
  11. VirtualBox系统虚拟盘格式转换vdi/vhd/vmdk
  12. 《超级演说家》刘媛媛:寒门贵子
  13. 不用找了,这300家公司面试不考算法
  14. mysql倒序获取最新10条后正序展示
  15. Arm V8内存管理架构.学习笔记
  16. Spark RDD 持久化
  17. BT下载的原理 和疑问
  18. 向量逆时针旋转ang度
  19. android sina 微博表情功能的实现
  20. 干货:何小鹏给你数数移动互联网不得不看的5个大坑

热门文章

  1. 判断回文(Java和JavaScript)
  2. 20201023:力扣第37场双周赛(上)
  3. 三支一扶计算机基础知识,2017聊城三支一扶考试内容-公基:计算机基础知识
  4. 卷积滤波 英文_图像处理必备英文词汇
  5. python的三种数据类型列举_3.Python编程之数据类型
  6. 【转载】煤层气大事记
  7. xp CMD命令参数
  8. GitHub 2200+星的任正非语录下架了,我们找到了一份fork版
  9. 特斯拉扭亏,股价暴涨;马斯克下一步:进军打车业务
  10. 一文看懂深度学习新王者「AutoML」:是什么、怎么用、未来如何发展?