上一篇文章介绍了Gin和Gin的简单使用,本次介绍Gin进阶使用,并和一些常用的库组合使用,最后测试运行并写入数据到PostgreSQL数据库。

可配置

在configs目录下,新增了config.yml作为配置文件,使用viper库读取配置文件参数,来设置Gin框架和一些其他参数。

func InitConfig() {
    viper.AddConfigPath("./configs")
    viper.SetConfigType("yaml")
    viper.SetConfigName("config")

    if err := viper.ReadInConfig(); err != nil {
        log.Fatalf("fatal error: read config file: %v", err)
    }
    if err := viper.Unmarshal(&AppConfig); err != nil {
        log.Fatalf("set config file error: %v", err)
    }
}

路由分组

新建router目录存放所有路由相关代码,router.go为主路由文件,example.go为分路由文件,使用Gin的路由Group设置路由组。

func InitRouter() *gin.Engine {
    router := gin.New()
    router.Use(gin.Recovery())
    if gin.Mode() == gin.DebugMode {
        router.Use(gin.Logger())
    }
    miniRLoad(router)
    adminRLoad(router)
    return router
}

GORM

全功能ORM,特性:支持事务,批量插入,SQL构建器,自动迁移,灵活的可扩展API,开发者友好。

在configs目录下,新增db.go,作为数据库配置部分,InitDB初始化数据库连接,MigrateDB来迁移模型变更到数据库中,会在启动时自动创建对应的表结构,无需手动在数据库中操作。

func InitDB() *gorm.DB {
    dsn := "host=" + AppConfig.DB.Host + " user=" + AppConfig.DB.User + " password=" + AppConfig.DB.Password + " dbname=" + AppConfig.DB.Name + " port=" + AppConfig.DB.Port + " sslmode=disable TimeZone=Asia/Shanghai"
    db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{
        DisableForeignKeyConstraintWhenMigrating: true,
    })
    if err != nil {
        global.Logger.Errorf("Failed to init db connection,error: %v", err)
    }
    return db
}

func MigrateDB() {
    err := global.DB.AutoMigrate(
        &model.Users{},
    )
    if err != nil {
        global.Logger.Errorf("Failed to migrate db,error: %v", err)
        os.Exit(0)
    }
}

Zap日志

在 Go 中实现极快、结构化、分级的日志记录,在官网测试记录中,普遍比其他日志库要快。

在pkg目录下,新建log包,新建logs.go,可以通过zap.NewProduction()来快速初始化Zap日志,但

缺少自定义,像日志格式、日志文件位置和日志切割,这部分代码较长,暂不在这里贴了,后面会提供整个项目代码库地址。

运行测试

上面组件都会在main.go中进行初始化,最后启动Gin框架提供http服务。

使用docker启动PostgreSQL数据库

docker run -d --name example -e POSTGRES_PASSWORD=example -p 5432:5432 postgres

进入项目的server目录下,运行下面命令启动Gin服务

go run main.go

发送一个POST请求到http://127.0.0.1:8080/api/user/add,Body内容如下,正常可在数据库中插入一条数据了。

{
    "userName" : "test",
    "pw":"aa1234"
}

介绍了Gin进阶使用,结合一些流行库,作为一个示例,完整代码请在GitHub上下载,具体链接为https://github.com/robin-2016/gin_example


RobinDevNotes
1 声望0 粉丝