結合 gin+gorm+go-Redis 寫一個基礎 API(上篇)

已下線發表於2020-06-10

初始化

新建目錄,初始化專案,執行:

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 協議》,轉載必須註明作者和本文連結
分享開發知識,歡迎交流。公眾號:開源到

相關文章