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

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

    1. yourAppName WEB部署目录(或者子目录)
    2. ├─apis 接口目录
    3. ├─user 用户模块
    4. ├─user.go 用户接口
    5. ├─websocket websocket模块
    6. ├─socket.go socket接口
    7. ├─struct.go 结构体文件
    8. ├─config 配置
    9. ├─config.json 配置文件
    10. ├─middleware 应用目录
    11. ├─DB 数据库连接
    12. ├─tools 小工具
    13. ├─config.go 读取配置
    14. ├─... 集成的一些小工具。第三方adkapi
    15. ├─router 路由
    16. ├─router.go 路由文件
    17. │─go.mod Golang包管理工具
    18. ├─go.sum Golang
    19. ├─main.go 入口文件
    20. ├─... 更多文件

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

    1. {
    2. "server": {
    3. "debug" : "true", // 开启debug模式
    4. "port" : ":8081" , // 服务启动时注册的端口号 记得带:
    5. },
    6. "mysql": {
    7. "host" : "127.0.0.1", // mysql地址
    8. "port" : "3306", // 端口号
    9. "username" : "IM", // 用户名
    10. "password" : "123456", // 密码
    11. "db_name": "im" // 连接的数据库
    12. },
    13. "redis": {
    14. "host": "127.0.0.1", // redis地址
    15. "port": "6379", // 端口号
    16. "password": "123456" // 密码
    17. }
    18. }

    接下来在middleware文件夹的tools文件夹中创建一个config.go文件,读取配置的代码就写在这里
    image.png

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

    1. const (
    2. filename = "./config/config.json"
    3. )

    image.png

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

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

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

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

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

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

    接下来就是第二部分,读取和写入配置,以及修改配置文件
    image.png

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

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

    1. // @File : config.go
    2. // @Author: JunLong.Liao&此处不应有BUG!
    3. package tools
    4. import (
    5. "encoding/json"
    6. "io/ioutil"
    7. )
    8. const (
    9. filename = "./config/config.json"
    10. )
    11. type Config map[string]map[string]string
    12. var Conf Config
    13. func init() {
    14. Conf = make(map[string]map[string]string)
    15. // 读取文件
    16. f, e := ioutil.ReadFile(filename)
    17. if e != nil {
    18. panic(filename + e.Error())
    19. }
    20. // 解析文件
    21. m := make(map[string]map[string]string)
    22. if err := json.Unmarshal(f, &m); err != nil {
    23. panic(filename + err.Error())
    24. }
    25. for key, value := range m {
    26. Conf[key] = make(map[string]string, 0)
    27. mm := make(map[string]string, 0)
    28. for k2, v2 := range value {
    29. mm[k2] = v2
    30. }
    31. Conf.Set(key, mm)
    32. }
    33. }
    34. func (c Config) Set(key string, value map[string]string) {
    35. c[key] = value
    36. }
    37. func (c Config) Get(Name, key string) (value string) {
    38. return c[Name][key]
    39. }
    40. func (c Config) Save() error {
    41. bytes, err := json.Marshal(Conf)
    42. if err != nil {
    43. return err
    44. }
    45. if err := ioutil.WriteFile(filename, bytes, 0); err != nil {
    46. return err
    47. }
    48. return nil
    49. }

    那么上面这个获取配置的方法已经写好了,那么就是使用了
    image.png

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