一文搞懂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)
}

最后大家自行测试吧~

相关文章
|
22天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
4月前
|
缓存 弹性计算 API
用 Go 快速开发一个 RESTful API 服务
用 Go 快速开发一个 RESTful API 服务
|
1月前
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
Go nil 空结构体 空接口有什么区别?
|
2月前
|
中间件 Go API
使用Go语言构建高性能RESTful API
在现代软件开发中,RESTful API因其简洁和高效而成为构建网络服务的首选。Go语言以其并发处理能力和高性能著称,是开发RESTful API的理想选择。本文将介绍如何使用Go语言构建RESTful API,包括基础的路由设置、中间件的使用、数据验证、错误处理以及性能优化。通过实际代码示例,我们将展示Go语言在API开发中的强大功能和灵活性。
|
3月前
|
存储 Go
Go to Learn Go之接口
Go to Learn Go之接口
37 7
|
3月前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
3月前
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
116 6
|
3月前
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。
|
4月前
|
XML JSON API
RESTful API设计最佳实践:构建高效、可扩展的接口
【8月更文挑战第17天】RESTful API设计是一个涉及多方面因素的复杂过程。通过遵循上述最佳实践,开发者可以构建出更加高效、可扩展、易于维护的API。然而,值得注意的是,最佳实践并非一成不变,随着技术的发展和业务需求的变化,可能需要不断调整和优化API设计。因此,保持对新技术和最佳实践的关注,是成为一名优秀API设计师的关键。
|
4月前
|
XML 存储 JSON
在Go中使用接口:实用性与脆弱性的平衡
在Go中使用接口:实用性与脆弱性的平衡