在项目中会在很多地方用到配置,那么在每个使用的地方去写一遍,这样麻烦,并且后期维护比较困难,所以讲配置都写在一个文件中,通过方法去读取到配置,这样修改配置只需要修改配置文件就可以实现目的。
在前面的目录结构中有一个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文件,读取配置的代码就写在这里
首先定义一个const常量来指定我们的配置文件所在
const (filename = "./config/config.json")

这里呢首先定义了一个Config声明了它是一个多维数组类型,并且定义了一个全部变量Conf
创建一个init的方法来做初始化,因为程序在执行前会自动执行init中的内容所以这里不需要大写
接下来将定义的全部变量先make一下初始化,不然直接使用会报错
接下来使用golang自带的包io包来读取文件中的内容,并判断是否读取成功,将读取到的内容通过json包来将文件中的内容解析成golang的数组内容
接下来是循环 for range 将获取到的数据进行循环拼接塞到Conf中
因为使用的是多层循环所以需要先将多维数组中的数组也进行make初始化 不然赋值就报错,程序无法运行
接下来就是第二部分,读取和写入配置,以及修改配置文件
这里注意到方法func (c Config) Set(key string, value map[string]string)前面都有一个(c Config) 这里相当于是PHP之类的语言的一个类,这个方法属于这个类的一个成员函数
下面是这个方法的完整代码
// @File : config.go// @Author: JunLong.Liao&此处不应有BUG!package toolsimport ("encoding/json""io/ioutil")const (filename = "./config/config.json")type Config map[string]map[string]stringvar Conf Configfunc 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}
那么上面这个获取配置的方法已经写好了,那么就是使用了
这里是系统启动时获取配置中的端口来启动,这里的方法用到了tools.Conf.Get("server", "port")因为我们上面的读取配置的方法写在tools包下面那么这里就是使用的tools包下面的Conf结构体的Get方法,其中第一个参数对应的是json中的一级key,第二个参数对应的是json中的二级key,直接这样就可以获取到json中设置的端口:8081
