一文搞懂Go搭建Restful接口

简介: 一文搞懂Go搭建Restful接口

前提说明

大家都知道,Go语言是云原生技术的主力语言,因此想要更好的学习并掌握云原生技术的前提是能熟练的使用Go语言,今天就带大家再次使用Go语言搭建一个简单的Restful风格的后端服务,其中包含CRUD功能,但是由于能更方便快速的开发完成,web层使用了Gin框架,dao层,即数据库访问层的代码就没有进行数据库的连接,直接操作内存做数据的增删改查,如有详细教程的需要请留言哈~

好滴,废话不多说,在学习这篇文章之前建议大家先了解下除了Go基本语法和设计规范以外,还有Restful的一些要点和Gin框架的基础,这里我就推荐下相关文章吧:

Gin框架:

《快速入门Gin框架搭建HTTP服务》

Restful要点:

《RESTful介绍和使用教程》

具体代码

安装Gin

go get -u github.com/gin-gonic/gin
复制代码

项目结构:

网络异常,图片无法展示
|


cmd/web/main.go

package main
import (
   "go_restful/pkg/web"
)
func main() {
   web.RouterGroup("7000")
}
复制代码

pkg/model/user.go

package model
type User struct {
   Id   int64  `json:"id"`
   Name string `json:"name"`
   Age  int    `json:"age"`
}
复制代码

pkg/dao/user_dao.go

package dao
import (
   "context"
   "go_restful/pkg/model"
   "log"
)
var users []*model.User
func init() {
   userList := make([]*model.User, 0)
   userList = append(userList, &model.User{Id: 1, Name: "zs", Age: 23})
   userList = append(userList, &model.User{Id: 2, Name: "ls", Age: 24})
   userList = append(userList, &model.User{Id: 3, Name: "ww", Age: 25})
   users = userList
}
type UserDAO interface {
   CreateUser(ctx context.Context, user *model.User) (bool, error)
   List(ctx context.Context) ([]*model.User, error)
   GetUserById(ctx context.Context, id int64) (model.User, error)
   DeleteUserById(ctx context.Context, id int64) (bool, error)
   UpdateUserById(ctx context.Context, user model.User) (bool, error)
}
type UserDaoImpl struct {
   UserDB []*model.User
}
func NewUserDaoImpl() *UserDaoImpl {
   return &UserDaoImpl{users}
}
func (u UserDaoImpl) CreateUser(ctx context.Context, user *model.User) (bool, error) {
   users = append(u.UserDB, user)
   printUsers()
   return true, nil
}
func (u UserDaoImpl) List(ctx context.Context) ([]*model.User, error) {
   return u.UserDB, nil
}
func (u UserDaoImpl) GetUserById(ctx context.Context, id int64) (model.User, error) {
   return *u.UserDB[id-1], nil
}
func (u UserDaoImpl) DeleteUserById(ctx context.Context, id int64) (bool, error) {
   newList := make([]*model.User, 0)
   for i := range u.UserDB {
      if i+1 != int(id) {
         newList = append(newList, u.UserDB[i])
      }
   }
   users = newList
   printUsers()
   return true, nil
}
func (u UserDaoImpl) UpdateUserById(ctx context.Context, user model.User) (bool, error) {
   newList := make([]*model.User, 0)
   for i := range u.UserDB {
      if i+1 == int(user.Id) {
         newList = append(newList, &user)
      } else {
         newList = append(newList, u.UserDB[i])
      }
   }
   users = newList
   printUsers()
   return true, nil
}
func printUsers() {
   for i := range users {
      log.Print(users[i])
   }
}
复制代码

pkg/web/controller/user_controller.go

package controller
import (
   "context"
   "encoding/json"
   "github.com/gin-gonic/gin"
   "go_restful/pkg/model"
   "go_restful/pkg/web/controller/impl"
   "io/ioutil"
   "log"
   "strconv"
)
type UserController interface {
   CreateUser(ctx context.Context, user model.User) (bool, error)
   List(ctx context.Context) ([]*model.User, error)
   GetUserById(ctx context.Context, id int64) (model.User, error)
   DeleteUserById(ctx context.Context, id int64) (bool, error)
   UpdateUserById(ctx context.Context, user model.User) (bool, error)
}
//CreateUser 添加User
func CreateUser(c *gin.Context) {
   body := c.Request.Body
   bytes, err := ioutil.ReadAll(body)
   user := model.User{}
   json.Unmarshal(bytes, &user)
   impl.MyUserControllerImpl.CreateUser(c, &user)
   if err != nil {
      log.Println(err)
   }
   c.JSON(200, "success")
}
//List 查看全部
func List(c *gin.Context) {
   list, err := impl.MyUserControllerImpl.List(c)
   if err != nil {
      log.Println(err)
   }
   c.JSON(200, list)
}
//GetUserById 根据ID查看
func GetUserById(c *gin.Context) {
   id := c.Param("id")
   intid, _ := strconv.Atoi(id)
   user, err := impl.MyUserControllerImpl.GetUserById(c, int64(intid))
   if err != nil {
      log.Println(err)
   }
   c.JSON(200, user)
}
//DeleteUserById 根据ID删除
func DeleteUserById(c *gin.Context) {
   id := c.Param("id")
   intid, _ := strconv.Atoi(id)
   res, err := impl.MyUserControllerImpl.DeleteUserById(c, int64(intid))
   if err != nil {
      log.Println(err)
   }
   c.JSON(200, res)
}
//UpdateUserById 根据Id修改
func UpdateUserById(c *gin.Context) {
   body := c.Request.Body
   bytes, err := ioutil.ReadAll(body)
   user := model.User{}
   json.Unmarshal(bytes, &user)
   if err != nil {
      log.Println(err)
   }
   res, err := impl.MyUserControllerImpl.UpdateUserById(c, user)
   c.JSON(200, res)
}
复制代码

pkg/web/controller/impl/user_controller.go

package impl
import (
   "context"
   "go_restful/pkg/dao"
   "go_restful/pkg/model"
)
type UserControllerImpl struct {
   dao *dao.UserDaoImpl
}
var MyUserControllerImpl *UserControllerImpl
func NewUserControllerImpl() *UserControllerImpl {
   return &UserControllerImpl{
      dao: dao.NewUserDaoImpl(),
   }
}
func init() {
   MyUserControllerImpl=NewUserControllerImpl()
}
func (u UserControllerImpl) CreateUser(ctx context.Context, user *model.User) (bool, error) {
   return u.dao.CreateUser(ctx, user)
}
func (u UserControllerImpl) List(ctx context.Context) ([]*model.User, error) {
   return u.dao.List(ctx)
}
func (u UserControllerImpl) GetUserById(ctx context.Context, id int64) (model.User, error) {
   return u.dao.GetUserById(ctx, id)
}
func (u UserControllerImpl) DeleteUserById(ctx context.Context, id int64) (bool, error) {
   return u.dao.DeleteUserById(ctx, id)
}
func (u UserControllerImpl) UpdateUserById(ctx context.Context, user model.User) (bool, error) {
   return u.dao.UpdateUserById(ctx, user)
}
复制代码

pkg/web/router.go

package web
import (
   "github.com/gin-gonic/gin"
   "go_restful/pkg/web/controller"
)
func RouterGroup(port string) {
   r := gin.Default()
   router := r.Group("/")
   {
      router.POST("/save", controller.CreateUser)
      router.GET("/list", controller.List)
      router.GET("/get/:id", controller.GetUserById)
      router.PUT("/update}", controller.UpdateUserById)
      router.DELETE("/delete/:id", controller.DeleteUserById)
   }
   r.Run("127.0.0.1:" + port)
}
复制代码

最后大家自行测试吧~


相关文章
|
4月前
|
存储 Go
Go语言之接口与多态 -《Go语言实战指南》
Go 语言中的接口是实现多态的核心机制,通过一组方法签名定义行为。任何类型只要实现接口的所有方法即视为实现该接口,无需显式声明。本文从接口定义、使用、底层机制、组合、动态行为到工厂模式全面解析其特性与应用,帮助理解 Go 的面向接口编程思想及注意事项(如 `nil` 陷阱)。
134 22
|
3月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
4月前
|
存储 JSON Go
Go语言之空接口与类型断言
本文介绍了 Go 语言中空接口(`interface{}`)和类型断言的核心概念及其应用。空接口可存储任意类型数据,适用于通用函数、动态数据结构与 JSON 解析等场景;类型断言用于将接口变量还原为具体类型,推荐使用带 `ok` 的写法以避免程序崩溃。此外,文章通过示例讲解了 `type switch` 类型判断与 JSON 处理技巧,并总结了空接口的注意事项,强调滥用可能导致类型安全性降低。内容深入浅出,帮助开发者灵活运用这些特性。
|
4月前
|
Go
Go语言接口的定义与实现
Go 语言的接口提供了一种灵活的多态机制,支持隐式实现和抽象编程。本文介绍了接口的基本定义、实现方式、空接口的使用、类型断言以及接口组合等核心概念,并探讨了接口与 nil 的关系及应用场景。通过示例代码详细说明了如何利用接口提升代码的可扩展性和可测试性,总结了接口的关键特性及其在依赖注入、规范定义和多态调用中的重要作用。
165 14
|
9月前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
10月前
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
210 1
Go nil 空结构体 空接口有什么区别?
|
11月前
|
中间件 Go API
使用Go语言构建高性能RESTful API
在现代软件开发中,RESTful API因其简洁和高效而成为构建网络服务的首选。Go语言以其并发处理能力和高性能著称,是开发RESTful API的理想选择。本文将介绍如何使用Go语言构建RESTful API,包括基础的路由设置、中间件的使用、数据验证、错误处理以及性能优化。通过实际代码示例,我们将展示Go语言在API开发中的强大功能和灵活性。
|
12月前
|
存储 Go
Go to Learn Go之接口
Go to Learn Go之接口
87 7
|
12月前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。