程序包开发,读取 ini 配置文件
任务目标
- 熟悉程序包的编写习惯(idioms)和风格(convetions)
- 熟悉 io 库操作
- 使用测试驱动的方法
- 简单 Go 程使用
- 事件通知
github地址
设计说明
获取包
使用命令 go get github.com/hupf3/ServiceComputing_hw/hw_readini/readini
读取配置文件
我们首先需要读取 .ini
文件,读取的函数我都放在了 read.go
文件中
- 全局变量:
flag
数据类型为int
,用于判断操作系统的类型,从而选择注释符:0 代表 ‘#’ ,1 代表 ‘;’
var flag int // 判断操作系统的类型从而决定注释符 0 : '#' 1 : ';'
- 结构体:config 用来存储配置文件的相关信息,包含了
filePath
,代表配置文件的路径,info 用了二维 map 来存储 section,key,value 的信息
// 存储配置文件的相关信息
type config struct {
filePath string // 配置文件路径
info map[string]map[string]string // 二维map存储 section,key,value 的关系
}
- init 函数:由于老师要求在 init 函数中判断操作系统的类型,所以我在里面实现了该要求(由于我的电脑是 macbook,所以操作系统为 darwin,所以我将操作系统为 darwin 的,flag 也设置为0)
// 先于 main 函数运行,用来判断操作系统
func init() {
if runtime.GOOS == "unix" || runtime.GOOS == "darwin" {
flag = 0
} else if runtime.GOOS == "windows" {
flag = 1
}
fmt.Println("The current operating system is " + runtime.GOOS)
if flag == 1 {
fmt.Println("Use ; as the annotation character")
} else if flag == 0 {
fmt.Println("Use # as the annotation character")
}
}
- readini 函数:该函数用于读取配置文件中的内容,该函数是结构体定义的方法,传入了 *config 参数,传入了指针,可以方便修改。返回了 error 变量,用来判断文件是否存在,或者在读取时是否有误。信息的读取是通过二维 map 和相关的 string 操作,具体的过程代码中的注释部分也有说明(值得一提的是,如果配置信息没有section 的相关信息,而是直接出现 key = value 的形式,此时将section设置成固定的值:“emptySection”)
func (c *config) readini() error {
// 打开文件
file, err := os.Open(c.filePath)
// 文件打开失败
if err != nil {
err = errors.New("Open file failed!")
fmt.Println("Error:", err)
return err
}
// 在函数调用后关闭文件
defer file.Close()
// 读取配置文件的内容
reader := bufio.NewReader(file)
var section, key, value string // 配置文件的信息
var note string // 注释符号
c.info = make(map[string]map[string]string) // 初始化