快速上手golang(持续更新)

由于项目需要,我不得不快速掌握go语言来帮助我进行项目的开发。时间紧迫到我来不及去了解语言的特性就直接项目上手了。我决定就先熟悉一个主流的go框架和go语言的一些日常用法,之后就得滑着这只破船摇摇晃晃上路了。

1 基础命令

就说几个用的多的,配环境就不说了,我就说说我的理解,可能很不专业:

go init mod [example] # 初始化一个go包
go get [package] # 拉取一个go模块,类似python的pip install
go mod tidy # 模块对齐,快速拉取所有需要的模块

我感觉有了这三个命令就可以勉勉强强上路了哈哈哈哈[狗头]。

2 gin框架

直接代码上手了,不管他里面做了什么。这是一个golang很常用的基础框架。

2.1 启动http服务

package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "pong",})})r.Run()
}

2.2 RESTFUL API

RESTful API是利用HTTP请求访问或使用数据的应用程序接口(API)的体系结构样式。它基于表示性状态转移(REST)的原则,是一种Web服务开发中经常使用的体系结构样式和通信方式。RESTful API的主要特点包括:

  1. 资源(Resources):以URL的形式表示应用程序中的资源,如/users表示用户资源。
  2. 统一接口(Uniform Interface):使用HTTP方法(GET、POST、PUT、DELETE)对资源进行操作,并使用HTTP状态码和响应内容来表示操作的结果。
  3. 无状态(Stateless):每个请求都是独立的,服务器不会在请求之间保留任何状态信息。
  4. 可缓存(Cacheable):对于不经常变化的资源,可以启用缓存提高性能。
  5. 分层系统(Layered System):可以通过代理服务器等中间件实现系统的扩展性和安全性。

RESTful API的优点包括:

  1. 轻量级:使用HTTP协议进行通信,使用简单的数据格式进行数据交换。
  2. 易于扩展:使用标准的HTTP方法和数据格式,可以很容易地扩展和修改API。
  3. 易于缓存:使用标准的HTTP协议,可以使用缓存技术来提高性能和可扩展性。
  4. 易于测试:通过浏览器或其他工具可以访问和测试API。

RESTful API在多个领域有广泛应用,包括电商领域的商品展示、购物车管理、订单处理等;社交网络领域的用户管理、好友关系及消息推送等功能;物联网领域的设备管理、数据采集和远程控制;以及移动应用的数据同步、用户认证和推送消息等功能。

总的来说,RESTful API为Web服务和应用程序提供了一种高效、可扩展且易于理解的通信方式,是构建现代化Web应用的重要组成部分。

2.2.1 Method
func main() {r := gin.Default()r.GET("/someGet", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "get",})})r.POST("/somePost", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "post",})})r.PUT("/somePut", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "put",})})r.DELETE("/someDelete", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "delete",})})r.PATCH("/somePatch", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "patch",})})r.HEAD("/someHead", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "head",})})r.OPTIONS("/someOpt", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "options",})})r.Run(":3000")
}

2.3 参数传递和获取

2.3.1 路径携带参数
func main() {router := gin.Default()router.GET("/user/:name", func(ctx *gin.Context) {name := ctx.Param("name")ctx.String(http.StatusOK, "Hello %s", name)})router.GET("/user/:name/*action", func(ctx *gin.Context) {name := ctx.Param("name")action := ctx.Param("action")message := name + "is" + actionctx.String(http.StatusOK, "Hello %s", message)})router.POST("/user/:name/*action", func(ctx *gin.Context) {b := ctx.FullPath() == "/user/:name/*action"ctx.String(http.StatusOK, "%t", b)})router.GET("user/groups", func(ctx *gin.Context) {ctx.String(http.StatusOK, "The acailable groups are [...]")})router.Run(":3000")
}

2.3.2 Querystring参数
func main() {router := gin.Default()router.GET("/welcome", func(ctx *gin.Context) {firstname := ctx.DefaultQuery("firstname", "Guest")lastname := ctx.Query("lastname")ctx.Request.URL.Query().Get("lastname")ctx.String(http.StatusOK, "Hello %s %s", firstname, lastname)})router.Run(":3000")
}

2.3.3 Form表单
func main() {router := gin.Default()router.POST("/form_post", func(ctx *gin.Context) {message := ctx.PostForm("message")lenn := ctx.DefaultPostForm("lenn", "anonymous")ctx.JSON(http.StatusOK, gin.H{"status":  "posted","message": message,"lenn":    lenn,})})router.Run(":3000")
}
2.3.4 文件上传
func main() {router := gin.Default()router.MaxMultipartMemory = 8 << 20router.POST("/upload", func(ctx *gin.Context) {file, _ := ctx.FormFile("file")log.Println(file.Filename)ctx.SaveUploadedFile(file, "/home/lennlouis/")ctx.String(http.StatusOK, fmt.Sprintf("'%s' upload!", file.Filename))})router.Run(":3000")
}
2.3.4.1 单文件上传
func main() {router := gin.Default()router.MaxMultipartMemory = 8 << 20router.POST("/upload", func(ctx *gin.Context) {file, _ := ctx.FormFile("file")log.Println(file.Filename)ctx.SaveUploadedFile(file, "/home/lennlouis/")ctx.String(http.StatusOK, fmt.Sprint("'%s' upload!", file.Filename))})router.Run(":8000")}
2.3.4.2 多文件上传
func main() {router := gin.Default()router.MaxMultipartMemory = 8 << 20router.POST("/upload", func(ctx *gin.Context) {form, _ := ctx.MultipartForm()files := form.File["upload[]"]for _, file := range files {log.Println(file.Filename)ctx.SaveUploadedFile(file, "/home/lennlouis/")}ctx.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files)))})router.Run(":8000")
}

2.4 路由(路由分组)

func loginEndpoint(c *gin.Context) {fmt.Println(c.Request.URL)
}func submitEndpoint(c *gin.Context) {fmt.Println(c.Request.URL)
}func readEndpoint(c *gin.Context) {fmt.Println(c.Request.URL)
}func main() {router := gin.Default()v1 := router.Group("/v1"){v1.POST("/login", loginEndpoint)v1.POST("/submit", submitEndpoint)v1.POST("/read", readEndpoint)}v2 := router.Group("/v2"){v2.POST("/login", loginEndpoint)v2.POST("/submit", submitEndpoint)v2.POST("/read", readEndpoint)}router.Run(":8000")
}

2.5 中间件

2.5.1 中间件的使用

2.5.2 自定义recover中间件

2.6 日志

2.6.1 写入到文件
func main() {gin.DisableConsoleColor()f, _ := os.Create("gin.log")gin.DefaultWriter = io.MultiWriter(f)router := gin.Default()router.GET("/ping", func(ctx *gin.Context) {ctx.String(http.StatusOK, "pong")})router.Run(":8000")
}
2.6.2 自定义格式
func main() {router := gin.New()router.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string { // your custom formatreturn fmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %s\"\n",param.ClientIP,param.TimeStamp.Format(time.RFC1123),param.Method,param.Path,param.Request.Proto,param.StatusCode,param.Latency,param.Request.UserAgent(),param.ErrorMessage,)}))router.Use(gin.Recovery())router.GET("/ping", func(c *gin.Context) {c.String(http.StatusOK, "pong")})router.Run(":8080")
}

2.7 模型绑定和验证

2.7.1 JSON
2.7.2 Query String
type Person struct {Name    string `form:"name`Address string `form:"address"`
}func main() {router := gin.Default()router.Any("/testing", startPage)router.Run(":8000")
}func startPage(c *gin.Context) {var person Personif c.ShouldBindQuery(&person) == nil {log.Println("====== Only Bind By Query String ======")log.Println(person.Name)log.Println(person.Address)}c.String(http.StatusOK, "Success")
}
2.7.3 QueryString or PostData
2.7.4 Bind Url
2.7.5 Bind Header

2.8 Protobuf

  1. 安装编译器

    go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
    
  2. 生成代码

    protoc -I=$SRC_DIR --go_opt=paths=source_relative --go_out=$DST_DIR $SRC_DIR/helloworld.proto
    

grpc

持续更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/34916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】使用信号进行进程间通信

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 ​ ​ 实现原理&a…

江苏隆昌化工上线隆道平台 采购管理迎来全面升级

当前&#xff0c;传统产业与数字产业深度加速融合&#xff0c;大数据、云计算、人工智能等新技术推动产业深刻变革&#xff0c;能源化工行业迎来战略转型加速期。数字化转型已成为能源化工企业提升运营效率、控制运营成本、提高产品质量、打造竞争优势的强大引擎。为实现传统采…

数据库管理-第213期 HaloDB-Oracle兼容性测试03(20240625)

数据库管理213期 2024-06-25 数据库管理-第213期 HaloDB-Oracle兼容性测试03&#xff08;20240625&#xff09;1 索引1.1 B-Tree索引1.2 Hash索引1.3 复合索引1.4 唯一索引1.5 表达式索引1.6 部分索引 2 视图3 表连接3.1 内连接3.2 左/右外连接3.3 全连接清理环境&#xff1a; …

Linux内核测试技术

Linux 内核是Linux操作系统的核心部分&#xff0c;负责管理硬件资源和提供系统调用接口。随着 Linux 内核的不断发展和更新&#xff0c;其复杂性和代码规模也在不断增加。因此&#xff0c;确保内核的稳定性和可靠性变得尤为重要。内核测试技术是实现这一目标的关键手段。本文将…

iptables配置NAT实现端口转发

加载防火墙的内核模块 modprobe ip_tables modprobe ip_nat_ftp modprobe ip_conntrack 1.开启路由转发功能 echo net.ipv4.ip_forward 1 >> /etc/sysctl.conf sysctl -p2、将本地的端口转发到本机端口 将本机的 7777 端口转发到 6666 端口。 iptables -t nat -A PR…

C# Winform 开源UI库

WinForms&#xff0c;作为微软.NET框架下的一个桌面应用程序开发工具&#xff0c;自1999年首次亮相以来&#xff0c;已经走过了二十多年的发展历程。它以其简单直观的拖拽式界面设计和丰富的控件库&#xff0c;成为了大众喜爱的入门学习编程工具。由于它是比较基础的开发工具&a…

Windows下如何实现微信多开/分身

新建文本文档 把下面的脚本复制到文本文档中 echo offstart "" "C:\Program Files\Tencent\WeChat\WeChat.exe" start "" "C:\Program Files\Tencent\WeChat\WeChat.exe"exit把wechat.exe的路径替换成你自已的路径 想多开几个就复制…

如何写好AI绘画提示词?保姆级教程来了!

前言 提示词编辑是一个结构化的过程&#xff0c;用能被人类解释和理解的词语来描述图像&#xff0c;也就是告诉人工智能模型应该怎么绘制图片。 生成优质图像的秘诀 1.提示词要想编辑好&#xff0c;包括修饰词和好的句子结构&#xff0c;首先你要了解所有的修饰词类型。 2.St…

SAP的RFID

射频识别 &#xff08;RFID&#xff09; 避免了条码扫描的局限性&#xff0c;条码扫描需要对每个条码进行视线访问&#xff0c;并且一次只能用于扫描一个项目。 一次扫描一个标签可能会令人厌烦和压力大&#xff0c;这会增加人为错误的机会。相反&#xff0c;RFID 标签不需要直…

紧贴国家大战略需求,聚焦当前行业热点-海云安D10入选第四届香蜜湖金融科技创新奖拟奖项目

近日&#xff0c;第四届香蜜湖金融科技创新奖终审总结会在深圳市福田区湾区国际金融科技城成功举办&#xff0c;活动现场&#xff0c;专家评审委员会最终揭晓25个拟奖项目。海云安“开发者安全助手系统”项目&#xff0c;实力入选第四届香蜜湖金融科技创新奖-优秀项目奖。 1、香…

关于导入springcloud项目一些jar加载不进去的问题处理

IntelliJ IDEA的Maven项目有时候通过右边Maven Projects面板的package或者install命令打包的时候&#xff0c;会报错导致打包失败&#xff0c;这是由于这两个命令打包前默认会运行tests测试&#xff0c;若测试失败则打包失败。但是有时候我们打包的时候一些项目配置是针对生产环…

如何解决远距离传输大文件慢的问题?

在数字化时代&#xff0c;无论是企业还是个人&#xff0c;经常需要处理跨越长距离的大规模文件传输任务。这种传输的效率和安全性对业务流程的顺畅至关重要。然而&#xff0c;我们经常遇到网络延迟、数据丢失、带宽限制等问题&#xff0c;这些都可能影响文件传输的效率。小编将…

从传统到智能:视频汇聚EasyCVR+AI视频监控如何助力仓储的智能化转型

随着物流行业的快速发展和市场竞争的加剧&#xff0c;仓储管理对于保证货物安全、提高运营效率显得尤为重要。传统的仓储监控方式已难以满足现代仓储管理的需求&#xff0c;因此&#xff0c;仓储视频智能监控解决方案应运而生。方案通过集成先进的视频监控技术、智能分析算法、…

HBDNY-40/1端子排电压继电器 DC110V 导轨安装 约瑟JOSEF

HBDNY系列端子排型电压电流继电器 系列型号&#xff1a;&#xff08;3、4过/低电压型&#xff0c;5、6过/低电流型&#xff09; HBDNY-30/1端子排型电压继电器&#xff1b;HBDNY-30/2端子排型电压继电器&#xff1b; HBDNY-30/3端子排型电压继电器&#xff1b;HBDNY-30/4端子…

Java 面试笔记 | Java 基础:线程池

前言 在日常的工作学习生活中&#xff0c;用一种好的方法去学习&#xff0c;可以更加有效&#xff0c;比如费曼学习法&#xff1a;将学到的知识用自己的组织的语言表达出来&#xff0c;如果能够清晰明白的向别人解释清楚&#xff0c;那么就说明你是真的懂了&#xff0c;学会了…

运行时库链接方式实践指南(MT、MD、MTd、MDd)

前言 笔者曾经编译一个库提供给使用者&#xff0c;提供库后发现由于运行时库连接方式不一致&#xff0c;导致使用者无法连接笔者提供的库。另一方面&#xff0c;理解和选择正确的运行时链接方式对于构建高效、可靠的应用程序至关重要。 因此&#xff0c;本文将展开运行时库的基…

新手教学系列——“笑看”单元测试(pytest)

探索单元测试的必要性 你是否曾经思考过,当前的业务场景是否真的需要单元测试?我们每个人负责的模块是否也需要单元测试?什么阻碍了我们进行单元测试呢?时间紧,任务重,还要写测试?这些都是我们在开发过程中常见的问题。假设我们有一个计划开发一周的项目,让我们看看有…

[Redis]事务

Redis事务 Redis 事务提供了一种将多个命令请求打包的功能。然后&#xff0c;再按顺序执行打包的所有命令&#xff0c;并且不会被中途打断。 但是&#xff0c;事务中的每条命令都会与 Redis 服务器进行网络交互&#xff0c;比较浪费资源 所以&#xff0c;日常开发中不建议使…

工控 UI 风格美轮美奂

工控 UI 风格美轮美奂