结合 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 服务
本作品采用《CC 协议》,转载必须注明作者和本文链接
 
           已下线 的个人博客
 已下线 的个人博客
         
             
             
             
           
           关于 LearnKu
                关于 LearnKu
               
                     
                     
                     粤公网安备 44030502004330号
 粤公网安备 44030502004330号 
 
推荐文章: