Golang实践之博客(五) 读取配置文件|Go主题月

928 阅读2分钟

前言

为何要使用配置文件?

  1. 数据集中管理,便于日后的维护
  2. 避免硬编码,更改内容,无需重新编译

目标

  • go-ini的使用
  • 调整读取配置文件数据

go-ini

功能特性

  1. 支持覆盖加载多个数据源(file, []byte, io.Reader and io.ReadCloser)
  2. 支持递归读取键值
  3. 支持读取父子分区
  4. 支持读取自增键名
  5. 支持读取多行的键值
  6. 支持大量辅助方法
  7. 支持在读取时直接转换为 Go 语言类型
  8. 支持读取和 写入 分区和键的注释
  9. 轻松操作分区、键值和注释
  10. 在保存文件时分区和键值会保持原有的顺序

下载安装

go get gopkg.in/ini.v1

读取配置文件数据

新增ini配置文件

[server]
HTTP_PORT = :8888

[database]
TYPE = mysql
USER = root
PASSWORD =
#127.0.0.1:3306  数据库IP:数据库端口号
HOST = 127.0.0.1:3306
NAME = blog

新增ConfigService

package ConfigService

import (
	"fmt"
	"gopkg.in/ini.v1"
	"os"
)

type DbInfo struct {
	TYPE         string
	USER         string
	PASSWORD     string
	HOST         string
	NAME         string
	HTTP_PORT    string
}

func GetAppConfig(key string) *DbInfo {
	cfg, err := ini.Load("Config/app.ini")
	if err != nil {
		fmt.Printf("Fail to read file: %v", err)
		os.Exit(1)
	}
	d := new(DbInfo)
	_ = cfg.Section(key).MapTo(d)
	return d
}

func GetServerConfig() *DbInfo {
	return GetAppConfig("server")
}

func GetDbConfig() *DbInfo {
	return GetAppConfig("database")
}

DbService连接字符串调整为读取配置

package DbService

import (
	"fmt"
	"golang-blog/Model/Entity"
	"golang-blog/Service/ConfigService"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var Db *gorm.DB

func ConnectDb() {
	var (
		err error
	)
	dbConfig := ConfigService.GetAppConfig("database")
	connectStr := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local", dbConfig.USER,
		dbConfig.PASSWORD,
		dbConfig.HOST, dbConfig.NAME)
	Db, err = gorm.Open(mysql.Open(connectStr), &gorm.Config{})
	if err != nil {
		panic(err)
	}

	// 自动生成表结构
	dbErr := Db.AutoMigrate(&Entity.UserEntity{})
	if dbErr != nil {
		println(err)
	}
}

Routers端口号读取配置文件

package Routers

import (
	"github.com/gin-gonic/gin"
	"golang-blog/Controller/HomeControoler"
	"golang-blog/Service/ConfigService"
)

func Init(router *gin.Engine) {
	home := router.Group("Home")

	// 1.首位多余元素会被删除(../ or //);
	//2.然后路由会对新的路径进行不区分大小写的查找;
	//3.如果能正常找到对应的handler,路由就会重定向到正确的handler上并返回301或者307.(比如: 用户访问/FOO 和 /..//Foo可能会被重定向到/foo这个路由上)
	router.RedirectFixedPath = true

	{
		home.GET("/", HomeControoler.Index)
		home.GET("/Hi", HomeControoler.Hi)
	}

	serverConfig := ConfigService.GetServerConfig()
	router.Run(serverConfig.HTTP_PORT) // 监听并在 127.0.0.1:8888 上启动服务
}

项目地址

github.com/panle666/Go…