Golang创建第一个web项目(Gin+Gorm)
1. 写这篇博客的由来:
当你想使用最快的框架创建项目的时候是不是有点束手无策?
当你想配置数据库写 SQL 甚至不知道如何写,文件夹都不知道建在哪里?
😄因为Golang 目前并没有 JAVA 那种硬性规范,但是 没硬性规范≠没有规范
我们以 Gin
(一个轻量的 WEB 框架,类似 SpringMVC)为切入点,来了解如何使用 Golang 快速创建一个规范的 web 项目,并且了解内部的一些简单的思维逻辑转换。
2. 创建合适的目录
首先我们要明白一个根本思路,Golang项目都是一小再小的项目,是为微服务服务的。
😄我们可以直接去掉一些没必要的抽象层,只保留最基本的逻辑层划分。
这些对应着 controller --> controller
, service --> logic
, dao --> db
.
当然,这些根据自己喜好就行,规范如 JAVA 都没有强制大家目录一致,更不用说灵活的 Golang 了。
3. 没有了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
。
4. 写一个登录接口
我们就从 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 }
5. 结语
Golang 还是挺好用的,但是转语言处理转换语法之外,一些处理业务的语法思路也和原来不同,不过有了原来的代码基础上手还是挺快的。
到此这篇关于Golang创建第一个web项目(Gin+Gorm)的文章就介绍到这了,更多相关Go创建web项目内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
GoLang RabbitMQ TTL与死信队列以及延迟队列详细讲解
这篇文章主要介绍了GoLang RabbitMQ TTL与死信队列以及延迟队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧2022-12-12详解Go语言中for循环,break和continue的使用
这篇文章主要通过一些示例为大家介绍一下Go语言中for循环、break和continue的基本语法以及使用,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下2022-06-06
最新评论