首页 > 其他分享 >前端视角下的Go语法学习:demo-crud 实现增删改查

前端视角下的Go语法学习:demo-crud 实现增删改查

时间:2024-07-03 10:26:28浏览次数:22  
标签:demo fmt crud go add func Go gin main

今日话题

基于 go + gin 实现增删改查,仅仅只是提供接口不涉及数据库增删改查

作者:云层上的光

时间:2024年6月22日 10时15分14秒

主线任务

一、项目创建

1、创建 demo-crud 文件夹

2、编辑器打开 demo-crud 项目,提示设置 go sdk,这里我设置了 1.22.4

3、声明 go.mod 文件

go mod init github.com/chuxin-cs/demo-crud

二、实现增删改查

1、新建 main.go 入口文件,修改 package 为 main

2、添加 main 方法

package main

import "fmt"

func main() {
	fmt.Println("demo-crud...")
}

3、提供 增删改查 方法

package main

import "fmt"

// 增
func add() {
	fmt.Println("add")
}
// 删
func del() {
	fmt.Println("del")
}
// 改
func edit() {
	fmt.Println("edit")
}
// 查
func getList() {
	fmt.Println("getList")
}
func main() {
	fmt.Println("demo-crud...")
	add()
	del()
	edit()
	getList()
}

4、输出打印

三、gin 实现增删改查

1、安装 gin 包,如果遇到报错看 支线任务一

go get -u github.com/gin-gonic/gin

2、编写 gin 代码

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
)

// 主函数,程序入口
func main() {
	// 打印信息,标记示例启动
	fmt.Println("demo-crud...")

	// 初始化Gin框架,默认装载中间件
	r := gin.Default()

	// 定义GET请求的路由"/add",处理函数接收一个gin.Context上下文参数
	r.GET("/add", func(c *gin.Context) {
		// 向发送请求的客户端响应状态码200(成功)和字符串"add"
		c.String(200, "add")
	})

	// 启动服务器,监听9000端口
	// 前端可以通过访问"http://localhost:9000/add"来与这个接口进行交互
	r.Run(":9000")
}

3、改造回调函数,完成增删改查

package main

import (
	"github.com/gin-gonic/gin"
)

// 增
func add(c *gin.Context) {
	c.String(200, "add")
}
// 删
func del(c *gin.Context) {
	c.String(200, "del")
}
// 改
func edit(c *gin.Context) {
	c.String(200, "edit")
}
// 查
func getList(c *gin.Context) {
	c.String(200, "getList")
}

func main() {
	r := gin.Default()
	r.GET("/add", add)
	r.GET("/del", del)
	r.GET("/edit", edit)
	r.GET("/getList", getList)
	// 运行在 9000 端口
	r.Run(":9000")
}

四、改造 gin 目录结构

1、新建 router 文件夹,然后再新建 index.go 文件

代码如下:

package router

import "github.com/gin-gonic/gin"

// Add 增
func Add(c *gin.Context) {
    c.String(200, "add")
}

// Del 删
func Del(c *gin.Context) {
    c.String(200, "del")
}

// Edit 改
func Edit(c *gin.Context) {
    c.String(200, "edit")
}

// GetList 查
func GetList(c *gin.Context) {
    c.String(200, "getList")
}

2、main.go 中改造

代码如下:

package main

import (
	"github.com/chuxin-cs/demo-crud/router"
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.GET("/add", router.Add)
	r.GET("/del", router.Del)
	r.GET("/edit", router.Edit)
	r.GET("/getList", router.GetList)
	// 运行在 9000 端口
	r.Run(":9000")
}

3、主入口程序中 其实不应该写这些代码,后续逻辑涉及到要用结构体,所以留到下期再写 TODO

支线任务

一、下载 gin 依赖失败

go 的插件包需要从 github上下载,网络问题这里就不多提了

其他语言都一样,我们前端的 npm 仓库在国外,依赖下载也会存在失败的情况,所以会通过设置淘宝镜像代理方案解决:

npm config set registry https://registry.npmmirror.com

所以 go 也是一样的,会存在依赖下载失败,以下是go 的通用解决办法:

1、Go modules 是 Go 1.11 版本引入的包管理工具,用于管理和版本控制项目的依赖项,

  • 网上这么说还是不是太明白,先设置吧,后续再研究 TODO
go env -w GO111MODULE=on

2、配置 proxy 代理,这一步操作和前端设置镜像是一个道理

go env -w GOPROXY=https://goproxy.cn,direct

3、查看配置是否修改成功

go env

4、gin 依赖下载

二、go get 下载依赖包?

1、go 代码中,下载 gin 包,使用 go get 命令

go get -u github.com/gin-gonic/gin

2、如果说 go get 是下载包的命令 那么这里的 -u 又是什么呢?

go get -u 命令的作用是用于更新依赖包到最新版本,那不就是说直接给我上最新依赖

那这就等价于前端的 latest 功能,安装axios最新版

npm i -S axios@latest

三、go mod tidy 也是下载依赖?

go mod tidy 是一个用于整理和优化 Go 模块依赖的命令。具体来说,它会执行以下操作:

  1. 移除未使用的依赖:删除 go.mod 文件中声明但在代码中未使用的包。
  2. 添加缺少的依赖:为代码中使用但未在 go.mod 文件中声明的包添加相应的依赖。
  3. 更新 go.sum 文件:确保 go.sum 文件中的校验和与依赖项的一致性。

简单来说,go mod tidy 可以帮助你保持模块依赖的整洁和一致。

1、听着很懵,换前端怎么理解呢,其实相当于前端拿到新项目之后,一把安装依赖的:

npm i

2、那就是说,下载 go 包我就

go get -u 项目包

3、拿到新的 go 项目,我就一把梭

go mod tidy

四、go 程序也存在回调函数,那我就放心了

1、定义 add 方法时,提供了回调函数,那么这块的玩法思路回到了前端的编程思路中

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
)

func main() {
	fmt.Println("demo-crud...")
    r := gin.Default()
	r.GET("/add", func(c *gin.Context) {
		c.String(200, "add")
	})
	// 运行在 9000 端口
	r.Run(":9000")
}

2、改造回调函数

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
)

func add(c *gin.Context){
    c.String(200, "add")
}

func main() {
	fmt.Println("demo-crud...")
    r := gin.Default()

    // 抽离一个 add 方法出去
	r.GET("/add", add)
    
	// 运行在 9000 端口
	r.Run(":9000")
}

五、gin.Default 的作用?

gin.Default() 在 Gin 框架中是一个便捷函数,它的作用是创建一个新的 gin.Engine 实例,并默认注册一些中间件,包括:

  • Logger: 提供请求日志记录。
  • Recovery: 当发生 panic 时自动恢复,避免服务崩溃,并记录 panic 的详细信息,虽然现在还不能完全看懂源码,但是我大致知道这里干了啥

1、简单点理解就是,gin.Default() 大致相当于在 Koa 中做了两件事:

  1. 创建一个新的 Koa 应用实例 (const app = new Koa()

    标签:demo,fmt,crud,go,add,func,Go,gin,main
    From: https://blog.csdn.net/weixin_45368328/article/details/140116798

相关文章

  • Golang 依赖注入设计哲学|12.6K 的依赖注入库 wire
    一、前言线上项目往往依赖非常多的具备特定能力的资源,如:DB、MQ、各种中间件,以及随着项目业务的复杂化,单一项目内,业务模块也逐渐增多,如何高效、整洁管理各种资源十分重要。本文从“术”层面,讲述“依赖注入”的实现,带你体会其对于整洁架构&DDD等设计思想的落地,起到的支撑作用。......
  • Google 发布了最新的开源大模型 Gemma 2,本地快速部署和体验
    Gemma2是Google最新发布的开源大语言模型。它有两种规模:90亿(9B)参数和270亿(27B)参数,分别具有基础(预训练)和指令调优版本,拥有8KTokens的上下文长度:Gemma-2-9b:90亿参数基础模型版本Gemma-2-9b-it:90亿参数基础模型的指令调优版本Gemma-2-27B:270亿参数基础模型版本G......
  • 【力扣 - 每日一题】3115. 质数的最大距离(一次遍历、头尾遍历、空间换时间、埃式筛、
    原题链接题目描述给你一个整数数组nums。返回两个(不一定不同的)质数在nums中下标的最大距离。示例1:输入:nums=[4,2,9,5,3]输出:3解释:nums[1]、nums[3]和nums[4]是质数。因此答案是|4-1|=3。示例2:输入:nums=[4,8,2,8]输出:0解释:nums[2]是质......
  • golang 构建标签(go:build)条件编译
     //go:build是Go语言(golang)中的一种构建标签(buildtag),用于控制源代码文件在特定条件下是否被编译。这个注释标记允许你在同一个包内编写针对不同平台、操作系统或编译条件的代码。当gobuild或gotest等命令执行时,它们会检查这些标签来决定哪些文件应该包含在构建过程中......
  • 区分公有地址和私有地址, golang实现
     区分公有地址(PublicIPAddresses)和私有地址(PrivateIPAddresses)主要依据它们的分配、使用范围以及是否能在全球互联网上直接路由。 以下是一些关键区别:  分配和管理: 公有地址:由互联网地址分配机构(InternetAssignedNumbersAuthority,IANA)管理......
  • Django框架之Cookie和Session概念,Django操作cookie,Django操作Session,CBV添加装饰器
    ⅠDjango框架之Cookie和Session概念【一】Cookie与Session的发展史Cookie和Session是用来在Web应用程序中跟踪用户会话数据的两种常用技术。【1】Cookie的发展史1994年,网景通信公司推出了第一个浏览器Cookie技术。Cookie是存储在用户计算机上的小型文本文件,用于跟踪用户......
  • Django 多对多关系
    多对多关系作用Django中,多对多关系模型的作用主要是为了表示两个模型之间的多对多关系。具体来说,多对多关系允许一个模型的实例与另一个模型的多个实例相关联,反之亦然。这在很多实际应用场景中非常有用,比如:博客和标签:一篇博客文章可以有多个标签,一个标签也可以属于多篇博客......
  • 遗传算法(Genetic Algorithm, GA)
        遗传算法是一种基于生物进化的计算模型,通过模拟自然选择和基因遗传的过程来寻找最优解或者近似最优解的算法。遗传算法由美国科学家JohnHolland在上世纪70年代提出,是一种全局优化搜索算法。     遗传算法的基本原理是通过模拟生物进化过程中的自然选择和......
  • Django3在网页上生成二维码
    1.安装包pipinstalldjango-qr-code2.在django项目的settings.py中,安装app打开项目的settings.py,找到INSTALLED_APPS,在这里增加一条'qr_code'INSTALLED_APPS=[...,'rest_framework','qr_code',...]3.在渲染的html文件中,导入模板{%loadqr_co......
  • go binary 与 gob
      在Go中,除了使用encoding/binary包将结构体转换为字节切片,还可以使用encoding/gob包进行序列化。两者各有优缺点,适用于不同的场景。以下是对比和示例:encoding/binary优点:高效:直接将结构体的内存布局写入字节切片,效率较高。简单:适用于简单的固定大小结构体。跨语......