第三节编写读取配置助手方法

在项目中会在很多地方用到配置,那么在每个使用的地方去写一遍,这样麻烦,并且后期维护比较困难,所以讲配置都写在一个文件中,通过方法去读取到配置,这样修改配置只需要修改配置文件就可以实现目的。

在前面的目录结构中有一个config文件夹 我们在文件夹中创建一个config.json,将配置文件都写在这个里面去获取

yourAppName  WEB部署目录(或者子目录)
├─apis          	接口目录
│  ├─user           用户模块
│  │  ├─user.go     用户接口 
│  ├─websocket      websocket模块
│  │  ├─socket.go   socket接口
│  │  ├─struct.go   结构体文件
├─config            配置
│  ├─config.json    配置文件
├─middleware        应用目录
│  ├─DB        		数据库连接
│  ├─tools    		小工具
│  │  ├─config.go   读取配置
│  ├─...      		集成的一些小工具。第三方adk,api等
│  │
├─router          	路由
│  ├─router.go      路由文件
│─go.mod            Golang包管理工具
│  ├─go.sum         Golang包
├─main.go     		入口文件
├─...				更多文件

文件内容如下,也可视情况增加

{
  "server": {
    "debug" : "true", // 开启debug模式
    "port" : ":8081" , // 服务启动时注册的端口号 记得带:
  },
  "mysql": {
    "host" : "127.0.0.1", // mysql地址
    "port" : "3306", // 端口号
    "username" : "IM", // 用户名
    "password" : "123456", // 密码
    "db_name": "im" // 连接的数据库
  },
  "redis": {
    "host": "127.0.0.1", // redis地址
    "port": "6379", // 端口号
    "password": "123456" // 密码
  }
}

接下来在middleware文件夹的tools文件夹中创建一个config.go文件,读取配置的代码就写在这里 ![image.png](https://img-blog.csdnimg.cn/img_convert/2306192932bf9727a6259b88819b0bcd.png#align=left&display=inline&height=184&margin=[object Object]&name=image.png&originHeight=368&originWidth=566&size=25043&status=done&style=none&width=283)

首先定义一个const常量来指定我们的配置文件所在

const (
	filename = "./config/config.json"
)

![image.png](https://img-blog.csdnimg.cn/img_convert/004c7977676e02ade62967f64bea71d4.png#align=left&display=inline&height=805&margin=[object Object]&name=image.png&originHeight=1610&originWidth=1284&size=177080&status=done&style=none&width=642)

这里呢首先定义了一个Config声明了它是一个多维数组类型,并且定义了一个全部变量Conf

创建一个init的方法来做初始化,因为程序在执行前会自动执行init中的内容所以这里不需要大写

接下来将定义的全部变量先make一下初始化,不然直接使用会报错

接下来使用golang自带的包io包来读取文件中的内容,并判断是否读取成功,将读取到的内容通过json包来将文件中的内容解析成golang的数组内容

接下来是循环 for range 将获取到的数据进行循环拼接塞到Conf中

因为使用的是多层循环所以需要先将多维数组中的数组也进行make初始化 不然赋值就报错,程序无法运行

接下来就是第二部分,读取和写入配置,以及修改配置文件 ![image.png](https://img-blog.csdnimg.cn/img_convert/e85cd46860eec2d2a61a37ff8bc5961e.png#align=left&display=inline&height=411&margin=[object Object]&name=image.png&originHeight=822&originWidth=1706&size=112684&status=done&style=none&width=853)

这里注意到方法func (c Config) Set(key string, value map[string]string)前面都有一个(c Config) 这里相当于是PHP之类的语言的一个类,这个方法属于这个类的一个成员函数

下面是这个方法的完整代码

// @File  : config.go
// @Author: JunLong.Liao&此处不应有BUG!
package tools

import (
	"encoding/json"
	"io/ioutil"
)

const (
	filename = "./config/config.json"
)

type Config map[string]map[string]string

var Conf Config

func init() {
	Conf = make(map[string]map[string]string)
	// 读取文件
	f, e := ioutil.ReadFile(filename)
	if e != nil {
		panic(filename + e.Error())
	}
	// 解析文件
	m := make(map[string]map[string]string)
	if err := json.Unmarshal(f, &m); err != nil {
		panic(filename + err.Error())
	}

	for key, value := range m {
		Conf[key] = make(map[string]string, 0)
		mm := make(map[string]string, 0)
		for k2, v2 := range value {
			mm[k2] = v2
		}
		Conf.Set(key, mm)
	}
}

func (c Config) Set(key string, value map[string]string) {
	c[key] = value
}

func (c Config) Get(Name, key string) (value string) {
	return c[Name][key]
}

func (c Config) Save() error {
	bytes, err := json.Marshal(Conf)
	if err != nil {
		return err
	}
	if err := ioutil.WriteFile(filename, bytes, 0); err != nil {
		return err
	}
	return nil
}

那么上面这个获取配置的方法已经写好了,那么就是使用了 ![image.png](https://img-blog.csdnimg.cn/img_convert/a1a7384301ea56acca0be6b771bf9e27.png#align=left&display=inline&height=239&margin=[object Object]&name=image.png&originHeight=478&originWidth=1936&size=67347&status=done&style=none&width=968)

这里是系统启动时获取配置中的端口来启动,这里的方法用到了tools.Conf.Get("server", "port")因为我们上面的读取配置的方法写在tools包下面那么这里就是使用的tools包下面的Conf结构体的Get方法,其中第一个参数对应的是json中的一级key,第二个参数对应的是json中的二级key,直接这样就可以获取到json中设置的端口:8081