在项目中会在很多地方用到配置,那么在每个使用的地方去写一遍,这样麻烦,并且后期维护比较困难,所以讲配置都写在一个文件中,通过方法去读取到配置,这样修改配置只需要修改配置文件就可以实现目的。
在前面的目录结构中有一个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 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
}
那么上面这个获取配置的方法已经写好了,那么就是使用了 
这里是系统启动时获取配置中的端口来启动,这里的方法用到了tools.Conf.Get("server", "port")
因为我们上面的读取配置的方法写在tools包下面那么这里就是使用的tools包下面的Conf结构体的Get方法,其中第一个参数对应的是json中的一级key,第二个参数对应的是json中的二级key,直接这样就可以获取到json中设置的端口:8081