初始化
新建目录,初始化项目,运行:
go mod init sai0556/gin-frame
// 使用本地module
go mod edit -require=local.com/sai0556/[email protected]
go mod edit -replace=local.com/sai0556/[email protected]=$PWD
编码
配置部分
新建config目录,初始化并监听文件:
package config
import (
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
)
type Config struct {
Name string
}
// 初始化配置
func Init(cfg string) error {
c := Config{
Name: cfg,
}
if err := c.initConfig(); err != nil {
return err
}
c.watchConfig()
return nil
}
func (c *Config) initConfig() error {
if c.Name != "" {
viper.SetConfigFile(c.Name)
} else {
// 默认配置文件是conf/config.yaml
viper.AddConfigPath("conf")
viper.SetConfigName("config")
}
viper.SetConfigType("yaml")
// viper解析配置文件
err := viper.ReadInConfig()
if err != nil {
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
fmt.Println(viper.GetString("name"))
return nil
}
func (c *Config) watchConfig() {
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("Config file changed:", e.Name)
})
}
conf/config.yaml,语法可自行研究下,比较简单。
YAML入门
name: gin-frame
db:
name: blog
host: 127.0.0.1:3306
username: root
password: 111111
charset: utf8mb4
数据库gorm
连接数据库,构建连接池:
package model
import (
"fmt"
"sync"
"errors"
orm "github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
"github.com/spf13/viper"
)
type MySqlPool struct {}
var instance *MySqlPool
var once sync.Once
var db *orm.DB
var err error
// 单例模式
func GetInstance() *MySqlPool {
once.Do(func() {
instance = &MySqlPool{}
})
return instance
}
func (pool *MySqlPool) InitPool() (isSuc bool) {
dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=%s", viper.GetString("db.username"), viper.GetString("db.password"), viper.GetString("db.host"), viper.GetString("db.name"), viper.GetString("db.charset"))
db, err = orm.Open("mysql", dsn)
if err != nil {
panic(errors.New("mysql连接失败"))
return false
}
// 连接数配置也可以写入配置,在此读取
db.DB().SetMaxIdleConns(50)
db.DB().SetMaxOpenConns(50)
// db.LogMode(true)
return true
}
main.go
我们完善一下main.go,初始化配置,并构建连接池:
package main
// import 这里我习惯把官方库,开源库,本地module依次列出
import (
"log"
"os"
"errors"
"github.com/spf13/pflag"
"local.com/sai0556/gin-frame/config"
"local.com/sai0556/gin-frame/model"
)
var (
conf = pflag.StringP("config", "c", "", "config filepath")
)
func main() {
pflag.Parse()
// 初始化配置
if err := config.Init(*conf); err != nil {
panic(err)
}
// 连接mysql数据库
isSuc := model.GetInstance().InitPool()
if !isSuc {
log.Println("init database pool failure...")
panic(errors.New("init database pool failure"))
}
}
写完不妨运行一下,看看效果吧!
go run main.go -c=./conf/config.yaml
参考:掘金小册juejin.im