使用 gin web 框架,在 moose-go 基础之上开发
在实际开发中,常用配置文件格式 properties、yaml、json、ini
解析 yaml 格式文件
使用第三方模块
安装
go get gopkg.in/yaml.v2
两个方法
Marshal 序列化 Unmarshal 反序列化
使用
数据
name: 江景
age: 18
hobby: ["code", "read"]
结构体
type Info struct {
Name string
Age int
Hobby []string
}
测试用例
func TestTemplate(t *testing.T) {
type Info struct {
Name string
Age int
Hobby []string
}
data := `
name: 江景
age: 18
hobby: ["code", "read"]
`
info := Info{}
err := yaml.Unmarshal([]byte(data), &info)
if err != nil {
t.Log(err)
return
}
t.Log(info)
}
运行测试用例
λ go test -v .\test\yaml_test.go
=== RUN TestTemplate
yaml_test.go:33: {江景 18 [code read]}
--- PASS: TestTemplate (0.00s)
PASS
ok command-line-arguments 0.040s
替换 JSON 配置
在原来配置数据库连接和应用信息使用 json 文件格式,现在替换为 yaml 配置文件格式
新建 application-dev.yml
app:
name: moose-go
mode: debug
mysql:
host: "127.0.0.1"
port: "3306"
driverName: mysql
username: root
password: "123456"
database: moose-go
redis:
host: localhost:6379
定义对应结构体
package model
type AppConfig struct {
App struct {
Name string `yaml:"name" json:"name"`
Mode string `yaml:"mode" json:"mode"`
}
MySql struct {
Host string `yaml:"host" json:"host"`
Port string `yaml:"port" json:"port"`
DriverName string `yaml:"driverName" json:"driverName"`
UserName string `yaml:"username" json:"username"`
Password string `yaml:"password" json:"password"`
DataBase string `yaml:"database" json:"database"`
}
Redis struct {
Host string `yaml:"host" json:"host"`
}
}
封装解析方法
var _yamlCfg *model.AppConfig = nil
func GetYamlConfig() *model.AppConfig {
return _yamlCfg
}
func ParseYamlConfig(path string) *model.AppConfig {
file, err := os.Open(path)
if err != nil {
panic(err)
}
defer file.Close()
data, err := ioutil.ReadAll(file)
err = yaml.Unmarshal([]byte(data), &_yamlCfg)
if err != nil {
panic(err)
}
log.Println(_yamlCfg)
return _yamlCfg
}
使用
替换原来 json 格式配置
main.go
func init() {
// util.ParseJSONConfig("./config/application-dev.json")
// 读取文件
util.ParseYamlConfig("./config/application-dev.yml")
// util.ParseYamlConfig("./config/application-prod.yml")
}
orm_engine.go
// .....
func NewOrmEngine() {
// 从读取的文件中获取结构体信息
appInfo := util.GetYamlConfig()
url := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8", appInfo.MySql.UserName, appInfo.MySql.Password, appInfo.MySql.Host, appInfo.MySql.Port, appInfo.MySql.DataBase)
engine, err := xorm.NewEngine(appInfo.MySql.DriverName, url)
if err != nil {
log.Panic(err.Error())
return
}
// .....
注意点
- 定义结构,定义字段必须大写开头,比如 name ==> Name
- 定义结构体,可以使用 tag 标签,比如 Name string
yaml:"name" - 读取配置文件结构需要和定义结构体保持一致