结合 gin+gorm+go-Redis 写一个基础 API(上篇)

初始化

新建目录,初始化项目,运行:

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 服务

go
本作品采用《CC 协议》,转载必须注明作者和本文链接
分享开发知识,欢迎交流。公众号:开源到
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!