Golang创建第一个web项目(Gin+Gorm)

 更新时间:2024年06月03日 09:11:49   作者:只会写bug的靓仔  
本文主要介绍了Golang创建第一个web项目(Gin+Gorm),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1. 写这篇博客的由来:

当你想使用最快的框架创建项目的时候是不是有点束手无策?

当你想配置数据库写 SQL 甚至不知道如何写,文件夹都不知道建在哪里?

在这里插入图片描述

😄因为Golang 目前并没有 JAVA 那种硬性规范,但是 没硬性规范≠没有规范

我们以 Gin (一个轻量的 WEB 框架,类似 SpringMVC)为切入点,来了解如何使用 Golang 快速创建一个规范的 web 项目,并且了解内部的一些简单的思维逻辑转换。

2. 创建合适的目录

首先我们要明白一个根本思路,Golang项目都是一小再小的项目,是为微服务服务的。

😄我们可以直接去掉一些没必要的抽象层,只保留最基本的逻辑层划分。

在这里插入图片描述

这些对应着 controller --> controller, service --> logicdao --> 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检查变量类型的四种方式

    Golang检查变量类型的四种方式

    Go提供几种方法检查变量的类型,在字符串格式化标识%T, 反射方式:reflect.TypeOf, reflect.ValueOf.Kind,另外还有使用类型断言,switch case方式,下面通过实例分别介绍这四类方法,需要的朋友可以参考下
    2022-10-10
  • Golang原生rpc(rpc服务端源码解读)

    Golang原生rpc(rpc服务端源码解读)

    本文主要介绍了Golang原生rpc(rpc服务端源码解读),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Go语言map实现顺序读取

    Go语言map实现顺序读取

    当我们遍历 map 时,那就是输出的键值对顺序是不确定的,本文主要介绍了Go语言map实现顺序读取, 文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • golang 熔断限流降级实践

    golang 熔断限流降级实践

    本文主要介绍了golang 熔断限流降级实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • 详解Golang中Channel的用法

    详解Golang中Channel的用法

    如果说goroutine是Go语言程序的并发体的话,那么channels则是它们之间的通信机制。这篇文章主要介绍Golang中Channel的用法,需要的朋友可以参考下
    2020-11-11
  • go语言中context的使用说明

    go语言中context的使用说明

    Go语言中的Context是用于在多个函数或goroutine之间传递取消信号、超时控制、截止时间和请求范围数据的重要概念,它提供了更好的控制和管理,适用于并发编程中需要传递状态或进行资源清理的场景
    2024-12-12
  • golang框架gin的日志处理和zap lumberjack日志使用方式

    golang框架gin的日志处理和zap lumberjack日志使用方式

    这篇文章主要介绍了golang框架gin的日志处理和zap lumberjack日志使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • golang实现微信小程序商城后台系统(moshopserver)

    golang实现微信小程序商城后台系统(moshopserver)

    这篇文章主要介绍了golang实现微信小程序商城后台系统(moshopserver),本文通过截图实例代码的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 如何理解Go函数是一等公民原理及使用场景

    如何理解Go函数是一等公民原理及使用场景

    这篇文章主要为大家介绍了如何理解Go函数是一等公民及使用场景详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Go 使用os包操作环境变量的方法

    Go 使用os包操作环境变量的方法

    环境变量通常在程序启动时就已设置好,在需要的时候随时读取,Go使用简单的几个函数就可以对环境变量进行增删查改,本文给大家介绍Go 使用os包操作环境变量的方法,感兴趣的朋友跟随小编一起看看吧
    2024-07-07

最新评论