Golang 创建第一个web项目(Gin + Gorm)
创作时间:
作者:
@小白创作中心
Golang 创建第一个web项目(Gin + Gorm)
引用
CSDN
1.
https://blog.csdn.net/faker1234546/article/details/139217696
当你想使用最快的框架创建项目的时候是不是有点束手无策?当你想配置数据库写 SQL 甚至不知道如何写,文件夹都不知道建在哪里?因为Golang 目前并没有 JAVA 那种硬性规范,但是没硬性规范≠没有规范。本文将以 Gin(一个轻量的 WEB 框架,类似 SpringMVC)为切入点,来了解如何使用 Golang 快速创建一个规范的 web 项目,并且了解内部的一些简单的思维逻辑转换。
1. 创建合适的目录
首先我们要明白一个根本思路,Golang项目都是一小再小的项目,是为微服务服务的。我们可以直接去掉一些没必要的抽象层,只保留最基本的逻辑层划分。这些对应着:
- controller --> controller
- service --> logic
- dao --> db
当然,这些可以根据自己的喜好进行调整,规范如 JAVA 都没有强制大家目录一致,更不用说灵活的 Golang 了。
2. 没有了application.yml 如何写数据库( DAO --> DB )
我这里分为两个文件:
- 一个文件为保存一些基本信息,初始化方法,连接池指针(db_config.go)在 Go 一般通过环境变量配置数据库信息,这里直接创建连接池。
由于 dao 和这个配置文件都在 db 包下,所以可以不直接暴露连接池指针。
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"os"
)
var db *gorm.DB
type DBConfig struct {
DbUser string
DbPassword string
DbName string
DbHost string
DbPort string
}
func NewDBConfig() *DBConfig {
return &DBConfig{
DbUser: os.Getenv("DB_USER"),
DbPassword: os.Getenv("DB_PASSWORD"),
DbName: os.Getenv("DB_NAME"),
DbHost: os.Getenv("DB_HOST"),
DbPort: os.Getenv("DB_PORT"),
}
}
func InitDB() {
config := NewDBConfig()
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", config.DbUser, config.DbPassword, config.DbHost, config.DbPort, config.DbName)
var err error
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
}
- 另一个文件是传统的 dao 层的内容,写一些读取数据的接口。正常的dao。
3. 写一个登录接口
我们就从 gin 的入口开始一直写到 db 层
- 在 main.go 中写 相关路由
func main() {
//初始化连接池
db.InitDB()
// 创建路由
r := gin.Default()
r.POST("/register", func(c *gin.Context) {
email := c.PostForm("email")
username := c.PostForm("username")
age, _ := strconv.Atoi(c.PostForm("age"))
fmt.Println("email->"+email, "username->"+username+"age->", age)
code, data := controller.RegisterUser(email, username, age)
c.JSON(code, gin.H{"data": data})
})
// 运行服务器
r.Run(":8080")
}
其实这里获取参数最好是放到controller里面,其实思路和 JAVA 一致,不过这里用的是方法而不是注解。
- 然后是 controller 层
package logic
import "easylive-user/db"
func RegisterUser(email string, username string, age int) (int, interface{}) {
return db.AddUser(email, username, age)
}
由于我在main.go 里已经处理过参数了,这里不需要怎么处理,这里如果想方便一点可以封装成结构体
- 然后是逻辑业务层 logic
注意到我们直接返回两个参数,一个状态码,一个返回数据,这里借助golang 可以返回多结果的特点,我们再次简化封装,不在使用 JAVA 的再封装一个回复体。直接借助 Http 的自有code 码判断,Golang 的思路是灵活,我的思路就是精简精简再精简。
Golang 由于本身不适合巨大的单体项目,我们就反其道而行之,能精简就精简
package logic
import "easylive-user/db"
func RegisterUser(email string, username string, age int) (int, interface{}) {
affected := db.AddUser(email, username, age)
if affected >= 1 {
return 200, nil
} else {
return 500, nil
}
}
- 然后是 db/dao层,这里涉及数据库的调用处理,这里我使用的是 Gorm 框架,类似 JAVA 的 Mybatis Plus,
func AddUser(email string, username string, age int) int {
result := db.Create(&User{Email: email, Name: username, Age: age})
fmt.Println(result)
return int(result.RowsAffected)
}
type User struct {
id int
Name string
Email string
Age int
}
4. 结语
Golang 还是挺好用的,但是转语言处理转换语法之外,一些处理业务的语法思路也和原来不同,不过有了原来的代码基础上手还是挺快的。
本文原文来自CSDN
热门推荐
雷霆vs火箭历史:经典对决中的烽火岁月
跑步呼吸的正确方法科学解析
别再用老旧架构了!单元化构建超强弹性和容错系统!
洞悉香港银行利率风险:影响因素与应对策略
C语言函数命名规范与最佳实践
媒体医声|跨科治疗告别“多科室奔波”,普陀区口腔综合门诊扩容
泰迪犬芒果过敏怎么办?症状处理与预防全攻略
游姓的起源与迁徙:历史名人及其在中国的分布
坡道辅助系统的使用方法和注意事项是什么?在驾驶时如何充分利用这一功能?
管理团队如何分配时间:十二个维度全面提升团队效率
世界干燥日 | Nature子刊带您了解「干燥综合征」发病机制最新进展
学车时心态怎么调整?
采购单进度管理:从标准化流程到数字化工具应用
哈佛研究证实:坚持这8种饮食模式,健康长寿几率提高86%!
成人身高与体重关系的科学解读
《胃肠病学》前沿速递 | 奥曲肽对胃肠道血管发育不良相关出血的治疗效果
车削刀具结构及几何参数对加工的影响
长期吃复合维生素,可能增加死亡风险?
为什么要创造出搜索引擎
做汉堡的视频全套教程
HACCP认证奶粉解读:确保食品安全的优质选择
武汉地铁3、6、10、11、12号线,官方回复开通和复工时间...
一个人旅游的独特体验:孤独与自由的交织
建筑赏析|在病房中飞起来的风筝——将色彩、平面插画与室内设计完美融合的医院儿科
新版高血压指南:力荐的6种中成药!
感冒防护与快速恢复秘籍:增强免疫,畅享畅快呼吸
如何选择适合入门投资者的股票?这些股票的选择标准和风险因素有哪些?
大学生如何应对学历贬值
在需求梳理中如何利用调查问卷和访谈
最终幻想7重制版剧情解析与角色深度剖析