当前位置: 首页 > news >正文

Go语言24小时极速学习教程(五)Go语言中的SpringMVC框架——Gin

作为一个真正能用的企业级应用,怎么能缺少RESTful接口呢?所以我们需要尝试在Go语言环境中写出我们的对外接口,这样前端就可以借由Gin框架访问我们数据库中的数据了。

一、Gin框架的使用

1. 安装 Gin

首先,你需要在你的 Go 项目中安装 Gin 框架。可以使用 go get 命令来安装,如果你使用了GoLand作为IDE,直接照着提示引入即可:

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

2. 创建一个简单的 Gin 应用

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {// 创建一个默认的路由引擎r := gin.Default()// 定义一个 GET 请求的路由r.GET("/", func(c *gin.Context) {c.String(http.StatusOK, "Hello, World!")})// 运行服务器,默认监听在 0.0.0.0:8080r.Run()
}

3. 路由定义

Gin 支持多种 HTTP 方法,如 GET、POST、PUT、DELETE 等。以下是一些基本的路由定义示例:

r.GET("/someGet", getting)
r.POST("/somePost", posting)
r.PUT("/somePut", putting)
r.DELETE("/someDelete", deleting)
r.PATCH("/somePatch", patching)
r.HEAD("/someHead", head)
r.OPTIONS("/someOptions", options)

类比于Java,相当于设置了GetMapping、PostMapping。

4. 路由参数

Gin 支持路径参数和查询参数。

路径参数
r.GET("/user/:name", func(c *gin.Context) {name := c.Param("name")c.String(http.StatusOK, "Hello %s", name)
})
查询参数
r.GET("/welcome", func(c *gin.Context) {firstname := c.DefaultQuery("firstname", "Guest")lastname := c.Query("lastname") // 等同于 c.Request.URL.Query().Get("lastname")c.String(http.StatusOK, "Hello %s %s", firstname, lastname)
})

5. 处理表单数据

Gin 可以轻松处理表单数据。

r.POST("/form_post", func(c *gin.Context) {message := c.PostForm("message")nick := c.DefaultPostForm("nick", "anonymous")c.JSON(200, gin.H{"status":  "posted","message": message,"nick":    nick,})
})

6. 处理 JSON 数据

Gin 可以轻松处理 JSON 请求和响应。

r.POST("/json", func(c *gin.Context) {var json struct {Name string `json:"name" binding:"required"`Age  int    `json:"age" binding:"required"`}if c.BindJSON(&json) == nil {c.JSON(http.StatusOK, gin.H{"name": json.Name,"age":  json.Age,})} else {c.JSON(http.StatusBadRequest, gin.H{"error": "请求的JSON有误"})}
})

7. 中间件

Gin 支持中间件,可以在请求处理之前或之后执行一些操作,放在Java里就相当于AspectJ作为AOP层来实现切面编程。

func Logger() gin.HandlerFunc {return func(c *gin.Context) {t := time.Now()// 设置 example 变量c.Set("example", "12345")// 请求前c.Next()// 请求后latency := time.Since(t)log.Print(latency)// 访问发送的 statusstatus := c.Writer.Status()log.Println(status)}
}func main() {r := gin.New()r.Use(Logger())r.GET("/test", func(c *gin.Context) {example := c.MustGet("example").(string)// 打印:"12345"log.Println(example)})// 监听并在 0.0.0.0:8080 上启动服务r.Run(":8080")
}

8. 静态文件服务

Gin 可以轻松地提供静态文件服务。

r.Static("/assets", "./assets")
r.StaticFS("/more_static", http.Dir("my_file_system"))
r.StaticFile("/favicon.ico", "./resources/favicon.ico")

9. 分组路由

Gin 支持路由分组,可以更好地组织和管理路由。

v1 := r.Group("/v1")
{v1.POST("/login", loginEndpoint)v1.POST("/submit", submitEndpoint)v1.POST("/read", readEndpoint)
}v2 := r.Group("/v2")
{v2.POST("/login", loginEndpoint)v2.POST("/submit", submitEndpoint)v2.POST("/read", readEndpoint)
}

10. 错误处理

Gin 提供了方便的错误处理机制。

r.GET("/panic", func(c *gin.Context) {panic("啊哦,出错了")
})r.Use(gin.Recovery())

11. 自定义 HTTP 配置

你可以自定义 HTTP 服务器配置。

s := &http.Server{Addr:           ":8080",Handler:        r,ReadTimeout:    10 * time.Second,WriteTimeout:   10 * time.Second,MaxHeaderBytes: 1 << 20,
}
s.ListenAndServe()

12. 使用模板引擎

Gin 支持模板引擎来渲染 HTML 页面。

r.LoadHTMLGlob("templates/*")r.GET("/index", func(c *gin.Context) {c.HTML(http.StatusOK, "index.tmpl", gin.H{"title": "Main website",})
})

Gin本身没有模板引擎,它用的是Go自带的标准库html/templatetext/template,下面是一个模板文件的例子:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{{ .title }}</title>
</head>
<body><h1>{{ .title }}</h1><p>欢迎光临我的网站!</p>
</body>
</html>

下面我单独开一章详细介绍一下模板如何编写

13. 使用 Session

Gin 本身不提供 Session 管理,但你可以使用第三方库如 gin-contrib/sessions

go get github.com/gin-contrib/sessions
import ("github.com/gin-contrib/sessions""github.com/gin-contrib/sessions/cookie""github.com/gin-gonic/gin"
)func main() {r := gin.Default()store := cookie.NewStore([]byte("secret"))r.Use(sessions.Sessions("mysession", store))r.GET("/incr", func(c *gin.Context) {session := sessions.Default(c)var count intv := session.Get("count")if v == nil {count = 0} else {count = v.(int)count++}session.Set("count", count)session.Save()c.JSON(200, gin.H{"count": count})})r.Run(":8000")
}

14. 使用 WebSocket

Gin 可以与 WebSocket 结合使用。

import ("github.com/gin-gonic/gin""github.com/gorilla/websocket""net/http"
)var upgrader = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool {return true},
}func websocketHandler(c *gin.Context) {conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)if err != nil {return}defer conn.Close()for {mt, message, err := conn.ReadMessage()if err != nil {break}err = conn.WriteMessage(mt, message)if err != nil {break}}
}func main() {r := gin.Default()r.GET("/ws", websocketHandler)r.Run(":8080")
}

二、模板引擎的使用

刚才我们提到了模板引擎,一般来说对于需要进行SEO优化的网站才会用上模板引擎,而普通的业务系统往往都是前后端分离的,对于前后端分离项目则不需要研究模板引擎如何使用。此外,如果你作为架构师正在考虑生成DSL、生成代码这类操作,也可以使用模板引擎来完成目标。类比于Java而言,模板引擎非常像Freemarker、Velocity这样的框架。Go 语言的 html/template 包是一个功能强大的模板引擎,支持多种模板语法和功能。以下是 html/template 中常用的模板写法:

1. 基本语法

变量输出

使用 {{ .variable }} 输出变量的值。

<p>你好, {{ .Name }}</p>
条件判断

使用 {{ if .condition }} ... {{ else }} ... {{ end }} 进行条件判断。

{{ if .IsAdmin }}<p>管理员</p>
{{ else }}<p>用户</p>
{{ end }}
循环迭代

使用 {{ range .list }} ... {{ end }} 进行循环迭代。

<ul>
{{ range .Items }}<li>{{ . }}</li>
{{ end }}
</ul>

2. 模板继承

定义块

使用 {{ define "block_name" }} ... {{ end }} 定义块。

{{ define "content" }}<p>这是一个内容块</p>
{{ end }}
包含块

使用 {{ template "block_name" . }} 包含块。

{{ template "content" . }}
基础模板

使用 {{ define "base" }} ... {{ end }} 定义基础模板。

{{ define "base" }}
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>{{ .Title }}</title>
</head>
<body><header><h1>{{ .Title }}</h1></header><main>{{ template "content" . }}</main><footer><p>© 2024 瑜美科技</p></footer>
</body>
</html>
{{ end }}

3. 模板函数

内置函数

html/template 提供了一些内置函数,如 and, or, not, len, index 等。

<p>总计数量: {{ len .Items }}</p>
自定义函数

使用 SetFuncMap 注册自定义函数。

package mainimport ("html/template""net/http""time"
)func formatAsDate(t time.Time) string {return t.Format("2006-01-02")
}func main() {tmpl := template.Must(template.New("").Funcs(template.FuncMap{"formatAsDate": formatAsDate,}).ParseFiles("templates/index.tmpl"))http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {tmpl.ExecuteTemplate(w, "index.tmpl", map[string]interface{}{"Date": time.Now(),})})http.ListenAndServe(":8080", nil)
}

模板文件中使用自定义函数:

<p>当前日期为: {{ formatAsDate .Date }}</p>

4. 模板注释

使用 {{/* ... */}} 添加模板注释。

{{/* 这是一段用户用F12也看不到的注释 */}}
<p>您好,{{ .Name }}</p>

5. 模板变量

使用 {{ $variable := .value }} 定义只在模板渲染生命周期过程中临时产生的变量。

{{ $name := .Name }}
<p>您好,{{ $name }}</p>

6. 模板安全

自动转义

html/template 自动转义 HTML 内容,防止 XSS 攻击。

<p>{{ .UnsafeHTML }}</p>
不转义

使用 {{ . | safeHTML }} 不转义 HTML 内容。

<p>{{ .UnsafeHTML | safeHTML }}</p>

总结

Gin 是一个功能强大且易于使用的 Web 框架,适用于构建高性能的 Web 应用。html/template 提供了丰富的模板语法和功能,包括变量输出、条件判断、循环迭代、模板继承、模板函数、模板注释、模板操作、模板变量和模板安全等。通过上述示例,你可以快速上手并开始构建你的 Go 语言 Web 应用。至此Go语言24小时极速学习教程就结束了,你可以直接开始参与一些企业级的Go Web项目了。怎么样,学的嗖嗖快对吧,至于数不熟练还需要靠练习,有很多编程中的技巧、数据结构、算法和设计模式与Java基本一致,所以如果你Java和C#玩的很6,相信Go语言也能在1天之内玩的非常6。

相关文章:

Go语言24小时极速学习教程(五)Go语言中的SpringMVC框架——Gin

作为一个真正能用的企业级应用&#xff0c;怎么能缺少RESTful接口呢&#xff1f;所以我们需要尝试在Go语言环境中写出我们的对外接口&#xff0c;这样前端就可以借由Gin框架访问我们数据库中的数据了。 一、Gin框架的使用 1. 安装 Gin 首先&#xff0c;你需要在你的 Go 项目…...

【汇编】c++游戏开发

由一起学编程创作的‘C/C项目实战&#xff1a;2D射击游戏开发&#xff08;简易版&#xff09;&#xff0c; 440 行源码分享来啦~’&#xff1a; C/C项目实战&#xff1a;2D射击游戏开发&#xff08;简易版&#xff09;&#xff0c; 440 行源码分享来啦~_射击c-CSDN博客文章浏览…...

Android Studio | 修改镜像地址为阿里云镜像地址,启动App

在项目文件的目录下的 settings.gradle.kts 中修改配置&#xff0c;配置中包含插件和依赖项 pluginManagement {repositories {maven { urluri ("https://www.jitpack.io")}maven { urluri ("https://maven.aliyun.com/repository/releases")}maven { urlu…...

Rocky linux8 安装php8.0

Rocky linux8 安装php8.0 1.安装remi源2.列出php版本3.变更php版本&#xff0c;Rocky8有提供php8版本&#xff0c;所以切换Rocky8提供的版本&#xff0c;而不是remi提供的版本&#xff0c;不过remi有提供php8.1和php8.2版本。4.切换成remi提供的8.0版本5.安装phpendl 1.安装rem…...

Ubuntu 18 EDK2 环境编译

视频&#xff1a;在全新的Ubuntu上从零搭建UEFI的EDK2开发环境 开始&#xff1a;git clone https://github.com/tianocore/edk2.git 开始编译BaseTools前先更新一下子模块&#xff1a;git submodule update --init &#xff0c;然后&#xff1a;make -C BaseTools/ 问题1&a…...

C语言项⽬实践-贪吃蛇

目录 1.项目要点 2.窗口设置 2.1mode命令 2.2title命令 2.3system函数 2.Win32 API 2.1 COORD 2.2 GetStdHandle 2.3 CONSOLE_CURSOR_INFO 2.4 GetConsoleCursorInfo 2.5 SetConsoleCursorInfo 2.5 SetConsoleCursorPosition 2.7 GetAsyncKeyState 3.贪吃蛇游戏设…...

智慧安防丨以科技之力,筑起防范人贩的铜墙铁壁

近日&#xff0c;贵州省贵阳市中级人民法院对余华英拐卖儿童案做出了一审宣判&#xff0c;判处其死刑&#xff0c;剥夺政治权利终身&#xff0c;并处没收个人全部财产。这一判决不仅彰显了法律的威严&#xff0c;也再次唤起了社会对拐卖儿童犯罪的深切关注。 余华英自1993年至2…...

Spring:IoC/DI加载properties文件

Spring框架可以通过Spring的配置文件完成两个数据源druid和C3P0的配置&#xff08;Spring&#xff1a;IOC/DI配置管理第三方bean&#xff09;&#xff0c;但是其中包含了一些问题&#xff0c;我们来分析下: 这两个数据源中都使用到了一些固定的常量如数据库连接四要素&#xf…...

Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Docker 概述 1.1 Docker 主要组成部分 1.2 Docker 安装 2.0 Docker 常见命令 2.1 常见的命令介绍 2.2 常见的命令演示 3.0 数据卷 3.1 数据卷常见的命令 3.2 常见…...

深挖C++赋值

详解赋值 const int a 10; int b a;&a 0x000000b7c6afef34 {56496} &a 0x000000b7c6afef34 {10} 3. &b 0x000000b7c6afef54 {10} 总结&#xff1a; int a 10 是指在内存中&#xff08;栈&#xff09;中创建一个int &#xff08;4 byte&#xff09;大小的空间…...

【免越狱】iOS砸壳 可下载AppStore任意版本 旧版本IPA下载

软件介绍 下载iOS旧版应用&#xff0c;简化繁琐的抓包流程。 一键生成去更新IPA&#xff08;手机安装后&#xff0c;去除App Store的更新检测&#xff09;。 软件界面 支持系统 Windows 10/Windows 8/Windows 7&#xff08;由于使用了Fiddler库&#xff0c;因此需要.Net环境…...

【python笔记02】面向对象思想

关于面向对象要学会啥&#xff1f; 面向对象编程思想面向对象基本概念 对象类 添加和获取对象属性魔术方法&#xff08;三个常见的&#xff09;面向对象案例 面向对象编程思想 两个时代的两个产物&#xff0c;没有好坏之分&#xff0c;小系统用面向过程&#xff0c;团队开发…...

Java基础-Java多线程机制

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、引言 二、多线程的基本概念 1. 线程与进程 2. 多线程与并发 3. 多线程的优势 三、Java多线程的实…...

MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并--封装到存储过程中

MySQL技巧之跨服务器数据查询&#xff1a;基础篇-A数据库与B数据库查询合并–封装到存储过程中 我们的最终目的是什么&#xff1f;当然的自动执行这些合并操作&#xff01; 上一篇 MySQL技巧之跨服务器数据查询&#xff1a;基础篇-A数据库与B数据库查询合并 我们已经知道怎么合…...

MATLAB向量元素的引用

我们定义一个向量后&#xff0c;如果想引用的话&#xff0c;可以通过索引 i n d ind ind来实现。 注意&#xff1a;MATLAB中向量的开始索引是1&#xff0c;与许多编程语言不同。 例如&#xff1a; 如果想引用多个的话&#xff0c;可以用索引 i n d ind ind来提取多个位置 例如…...

leetcode-44-通配符匹配

题解&#xff1a; 代码&#xff1a; 参考&#xff1a; (1)牛客华为机试HJ71字符串通配符 (2)leetcode-10-正则表达式匹配...

基于YOLOv8深度学习的智慧课堂学生专注度检测系统(PyQt5界面+数据集+训练代码)

本研究提出了一种基于YOLOv8深度学习的智慧课堂学生专注度检测系统&#xff0c;旨在实现对课堂中学生专注度的实时分析与评估。随着智慧教育的快速发展&#xff0c;学生的课堂表现和专注度成为评估学习效果的重要因素之一。然而&#xff0c;传统的专注度评估方法往往依赖于主观…...

vue项目使用eslint+prettier管理项目格式化

代码格式化、规范化说明 使用eslintprettier进行格式化&#xff0c;vscode中需要安装插件ESLint、Prettier - Code formatter&#xff0c;且格式化程序选择为后者&#xff08;vue文件、js文件要分别设置&#xff09; 对于eslint规则&#xff0c;在格式化时不会全部自动调整&…...

Java基础-组件及事件处理(中)

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 BorderLayout布局管理器 说明&#xff1a; 示例&#xff1a; FlowLayout布局管理器 说明&#xff1a; …...

UNIX网络编程-TCP套接字编程(实战)

概述 TCP客户端/服务器程序示例是执行如下步骤的一个回射服务器&#xff1a; 客户端从标准输入读入一行文本&#xff0c;并写给服务器。服务器从网络输入读入这行文本&#xff0c;并回射给客户端。客户端从网络输入读入这行回射文本&#xff0c;并显示在标准输出上。 TCP服务器…...

python编写一个自动清理三个月以前的邮件脚本

以下是一个使用 Python 编写的自动清理三个月以前的邮件的脚本。这个脚本适用于连接支持 IMAP 协议的邮箱服务&#xff0c;例如 Gmail。请注意&#xff0c;在执行此操作时&#xff0c;您需要提供电子邮件账号和应用程序专用密码&#xff08;建议不要使用普通密码&#xff0c;并…...

C++组合复用中,委托的含义与作用

委托&#xff08;Delegation&#xff09;的含义与作用 委托是一种软件设计技术&#xff0c;它允许一个对象在处理某个请求时&#xff0c;将请求的处理责任转移给另一个对象。委托的核心思想是通过组合&#xff08;composition&#xff09;而不是继承&#xff08;inheritance&a…...

自制C++游戏头文件:C++自己的游戏头文件!!!(后续会更新)

引言 在这个数字时代&#xff0c;计算机游戏已经成为人们生活中不可或缺的一部分。它们不仅为我们带来了无尽的乐趣&#xff0c;还激发了我们的创造力和解决问题的能力。今天&#xff0c;我们将深入探讨一个特别的头文件——CPPgame.h&#xff0c;它包含了多个结构体和函数&am…...

java 读取 有时需要sc.nextLine();读取换行符 有时不需要sc.nextLine();读取换行符 详解

在 Java 中&#xff0c;使用 Scanner 类读取输入时&#xff0c;换行符的处理行为取决于所用的读取方法。不同方法的工作原理会影响是否需要额外调用 sc.nextLine() 来清理缓冲区中的换行符。 核心问题 根本原因&#xff1a;Scanner 是基于输入流工作的&#xff0c;而换行符&am…...

Redis知识分享(三)

目录 前言 七、事务管理 7.1事务中的异常处理 八、订阅发布 8.1概述 ​8.2.Redis针对发布订阅相关指令 九、主从复制 9.1主从复制概述 9.2.主从复制的用处 9.3主从复制实现原理 ​9.3.1.psync指令 9.3.2.复制偏移量 9.3.3复制积压缓冲区&节点ID 前言 今天…...

python安装包报错

多次安装均报错 ERROR: Could not find a version that satisfies the requirement win10toast ERROR: No matching distribution found for win10toast 然后还提示 WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connectio…...

Linux性能优化之火焰图简介

Linux 火焰图&#xff08;Flame Graph&#xff09;是一种可视化工具&#xff0c;用于分析程序性能问题&#xff0c;尤其是 CPU 使用情况。它展示了程序中函数调用的层次结构和各个调用栈占用的时间比例。 以下是详细介绍&#xff0c;包括火焰图的工作原理、生成步骤和实际使用中…...

Unity类银河战士恶魔城学习总结(P129 Craft UI 合成面板UI)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了合成面板的UI设置 UI_CraftWindow.cs 字段作用&#xff1a; UI 组件&#xff1a; itemName / itemDescription / icon&#…...

linux基础笔试练习题笔记(2)

在Linux系统上&#xff0c;下面那个命令不可以用来查看文件内容&#xff08;&#xff09; A.cat B.ls C.less D.more 答案解析&#xff1a; cat命令用用于一次性显示文件的所有内容&#xff0c;一般文件内容较多时一般会使用more或less命令。 more:分页显示文件内容&#xf…...

Android OpenGL ES详解——glTexImage2D方法

glTexImage2D是OpenGL中的一个重要函数&#xff0c;其作用是为2D纹理分配显存并上传数据。以下是关于glTexImage2D作用的详细解释&#xff1a; 一、函数原型 在OpenGL ES 2.0中&#xff0c;glTexImage2D的函数原型如下&#xff1a; GL_APICALL void GL_APIENTRY glTexImage2…...

wordpress博客栏目设计/小学生关键词大全

1、分布式&#xff1a;一个业务分拆多个子业务&#xff0c;部署在不同的服务器上。 2、集群&#xff1a;同一个业务&#xff0c;部署在多个服务器上。 3、集群是解决高可用的&#xff0c;而分布式是解决高性能、高并发的。 4、集群是个物理形态&#xff0c;分布式是个工作方…...

网站建设视频教程/企业邮箱注册

此文转载自&#xff1a;https://blog.csdn.net/huanqingdong/article/details/112389152拿到字节offer已经有两周多了&#xff0c;目前手头工作也交接的差不多了。今天对字节面试过程做个总结&#xff0c;希望能够帮助到想去大厂的人。 时间介绍岗位是运维研发岗周日11-22 20.3…...

开发小网站一般多少钱一个/今日十大头条新闻

1.简介 JSR是Java Specification Requests的缩写&#xff0c;意思是Java 规范提案 JSR-303 是JAVA EE 6 中的一项子规范&#xff0c;叫做Bean Validation 即&#xff0c;JSR 303&#xff0c;Bean Validation规范 &#xff0c;为Bean验证定义了元数据模型和API.。默认的元数据…...

中国建设网银登录/昆明百度关键词优化

Elastricsearch学习 及 head插件 文章目录Elastricsearch学习 及 head插件一、Elastricsearch简单概念索引 index(库)类型 type&#xff08;表&#xff09;文档 document&#xff08;一条记录&#xff09;字段 Field&#xff08;字段&#xff09;映射 mapping二、安装安装elast…...

怎样注册一个网站做电商/营销失败案例分析

在写VC及标准C程序时&#xff0c;我们常用sprint函数来将数值转换为字符串。可在Keil C中使用这个函数时就要注意了。请看下面例程&#xff1a; /*main.cDesigned by Bill LiuVersion 0.0 Modified last by Bill Liu on 12/19/2021 */#include "main.h" ui8 tem; u…...

如何制作网站的横幅/企业文化设计

1.概述SSJ3型电力机车是六轴、大功率交流传动干线货运电力车,2001年原铁道部科技司立项,由连车公司在2004年研制成功的,具有我国自主知识产权,适应我国铁路现代货运要求的交流传动货运电力机车。机车持续功率7200kW,最高速度120km/h,持续速度53.9km/h,持续牵引力480.9kN,轴式C0…...