从去年12月底开始接触golang,用过revel和beego框架。最后选择了beego,用beego的原因也很简单,因为beego是中国人开发的,有中文文档。
golang起源于C语言,虽然不支持面向对象编程,但还是提供了接口interface、匿名字段等方式。虽然进行面向对象编程还是有点别扭,但是好歹都能实现。这里借花献佛,介绍一下beego的config包,顺便提一下golang的面向对象编程。
config包的config.go
文件定义了两个接口,ConfigContainer
和Config
,ConfigContainer定义了如何从原始数据里面获取配置信息的方法。Config接口是一个适配器,定义了把原始数据解析到ConfigContainer的方法。
config包里的其它文件是这两个接口的实现。xml文件夹实现了解析XML数据格式的方法,yaml文件夹实现了解析YAML格式的方法,ini和json分别解析INI格式和JSON格式。这里主要说一下INI格式的实现。
ini.go
文件定义了两个结构体IniConfigContainer
和IniConfig
,分别实现了上面的两个接口。golang接口的实现语法可以参考之前的文章《Golang 接口实现》。其中,IniConfigContainer不光实现了接口,还定义了内部变量来辅助实现。
filename string
data map[string]map[string]string // section=> key:val
sectionComment map[string]string // section : comment
keyComment map[string]string // id: []{comment, key...}; id 1 is for main comment.
sync.RWMutex
data
是用map实现的,用来保存配置文件的键值对。IniConfigContainer还有一个匿名对象sync.RWMutex
,这是golang继承的语法,说明IniConfigContainer继承了同步锁,在这里用于互斥修改配置文件的值。config包和INI格式的实现可以参考下图。
原文链接:beego/config包源码分析,转载请注明来源!
有疑问加站长微信联系(非本文作者)