初始化
新建目錄,初始化專案,執行:
go mod init sai0556/gin-frame
// 使用本地module
go mod edit -require=local.com/sai0556/gin-frame@v1.0.0
go mod edit -replace=local.com/sai0556/gin-frame@v1.0.0=$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
參考:
基於 Go 語言構建企業級的 RESTful API 服務
本作品採用《CC 協議》,轉載必須註明作者和本文連結