0%

golang笔记-gcfg组件

从ini配置文件中读取服务器配置,是开发中常见的任务,这种从文件中读取固定配置和从配置中心读取统一配置,可以相互配合,给运维提供灵活的方法,本文记录使用gcfg组件读取ini文件的简单方法。

1. 定义读取结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import (
log "github.com/sirupsen/logrus"
"gopkg.in/gcfg.v1"
)

type EProductMode string

const (
ENone EProductMode = ""
EDebug EProductMode = "debug"
ERelease EProductMode = "release"
)

type Common struct {
ProductMode EProductMode
}

// config
type Mysql struct {
Host string
Port int
Username string
Password string
DB string
}

type Redis struct {
Host string
Port int
}

// 这个是主要的读取结构
type AppConfig struct {
Common Common
Mysql Mysql
Redis Redis
}

2. 从文件中读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 可以从配置中读取也可以从远端更新的结构
var g_config *AppConfig
// 读取的文件名字
var configFile = "app.conf"

// package初始化时调用的函数
func init() {
dconfig := &AppConfig{}
err := gcfg.ReadFileInto(dconfig, configFile)
if err != nil {
log.Errorf("Load %s Failed:%v", configFile, err)
return
}
g_config = dconfig
}

// 给外部模块使用的结构
func Get() *AppConfig {
return g_config
}

3.ini文件格式

1
2
3
4
5
6
7
8
9
10
11
12
13
[Common]
ProductMode = "debug"

[Mysql]
host = 127.0.0.1
port = 3306
username = "root"
password = "123456"
db = "chess"

[Redis]
host = 127.0.0.1
port = 8888

定义的每个节是用来区分不同的模块使用的。

结语
ini文件节对应golang定义的结构,不然读取会fatal,布尔型定义为true或者false;文件的编码格式默认为utf8的,文件不能为空.详细细节参见源码主页的文档。gcfg的github源