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

news2024/11/18 2:50:33

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

一、Gin框架的使用

1. 安装 Gin

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

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

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

package main

import (
    "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:8080
    r.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)

        // 访问发送的 status
        status := 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 int
        v := 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 main

import (
    "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。

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

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

相关文章

RAG经验论文《FACTS About Building Retrieval Augmented Generation-based Chatbots》笔记

《FACTS About Building Retrieval Augmented Generation-based Chatbots》是2024年7月英伟达的团队发表的基于RAG的聊天机器人构建的文章。 这篇论文在待读列表很长时间了&#xff0c;一直没有读&#xff0c;看题目以为FACTS是总结的一些事实经验&#xff0c;阅读过才发现FAC…

Java 简单家居开关系统

1.需求&#xff1a; 面向对象编程实现智能家居控制系统&#xff08;简单的开关&#xff09; 2.实现思路 1.定义设备类&#xff1a;创建设备对象代表家里的设备 JD类&#xff1a; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;D…

任务调度工具Spring Test

Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 作用&#xff1a;定时自动执行某段Java代码 应用场景&#xff1a; 信用卡每月还款提醒 银行贷款每月还款提醒 火车票售票系统处理未支付订单 入职纪念日为用户发送通知 一.…

SAFETY LAYERS IN ALIGNED LARGE LANGUAGEMODELS: THE KEY TO LLM SECURITY

目录 概要 背景 大语言模型对齐 对齐大语言模型中的过度拒绝 微调攻击 研究设置 问题定义 对齐的大语言模型 大语言模型的提示模板 安全层的存在和定位 安全层的存在性 1.从余弦相似度说明 2.从向量之间角度差异说明 3.与预训练LLM对比说明 安全层的定位 1.推理…

netcore Kafka

一、新建项目KafakDemo <ItemGroup><PackageReference Include"Confluent.Kafka" Version"2.6.0" /></ItemGroup> 二、Program.cs using Confluent.Kafka; using System; using System.Threading; using System.Threading.Tasks;names…

在k8s上部署Crunchy Postgres for Kubernetes

目录 一、前言二、安装Crunchy Postgres for Kubernetes三、部署一个简单的postgres集群四、增加pgbouncer五、数据备份六、备份恢复七、postgres配置参数八、数据导入九、权限管理 一、前言 Crunchy Postgres可以帮助我们在k8s上快速部署一个高可用、具有自动备份和恢复功能的…

函数指针示例

目录&#xff1a; 代码&#xff1a; main.c #include <stdio.h> #include <stdlib.h>int Max(int x, int y); int Min(int x, int y);int main(int argc, char**argv) {int x,y;scanf("%d",&x);scanf("%d",&y);int select;printf(&q…

计算机网络:运输层 —— 运输层端口号

文章目录 运输层端口号的分类端口号与应用程序的关联应用举例发送方的复用和接收方的分用 运输层端口号的分类 端口号只具有本地意义&#xff0c;即端口号只是为了标识本计算机网络协议栈应用层中的各应用进程。在因特网中不同计算机中的相同端口号是没有关系的&#xff0c;即…

牛客挑战赛77

#include <iostream>// 函数 kXOR&#xff1a;计算两个数在 k 进制下的异或和 // 参数&#xff1a; // a: 第一个正整数 // b: 第二个正整数 // k: 进制基数 // 返回值&#xff1a; // 两数在 k 进制下的异或和&#xff08;十进制表示&#xff09; long long kXO…

大数据-225 离线数仓 - 目前需求分析 指标口径 日志数据采集 taildir source HDFS Sink Agent Flume 优化配置

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【流量分析】常见webshell流量分析

免责声明&#xff1a;本文仅作分享&#xff01; 对于常见的webshell工具&#xff0c;就要知攻善防&#xff1b;后门脚本的执行导致webshell的连接&#xff0c;对于默认的脚本要了解&#xff0c;才能更清晰&#xff0c;更方便应对。 &#xff08;这里仅针对部分后门代码进行流量…

springboot基于Web足球青训俱乐部管理后台系统开发(代码+数据库+LW)

摘 要 随着社会经济的快速发展&#xff0c;人们对足球俱乐部的需求日益增加&#xff0c;加快了足球健身俱乐部的发展&#xff0c;足球俱乐部管理工作日益繁忙&#xff0c;传统的管理方式已经无法满足足球俱乐部管理需求&#xff0c;因此&#xff0c;为了提高足球俱乐部管理效率…

电子应用设计方案-12:智能窗帘系统方案设计

一、系统概述 本设计方案旨在打造便捷、高效的全自动智能窗帘系统。 二、硬件选择 1. 电机&#xff1a;选用低噪音、扭矩合适的智能电机&#xff0c;根据窗帘尺寸和重量确定电机功率&#xff0c;确保能平稳拉动窗帘。 2. 轨道&#xff1a;选择坚固、顺滑的铝合金轨道&…

使用Element UI实现前端分页,及el-table表格跨页选择数据,切换分页保留分页数据,限制多选数量

文章目录 一、前端分页1、模板部分 (\<template>)2、数据部分 (data)3、计算属性 (computed)4、方法 (methods) 二、跨页选择1、模板部分 (\<template>)2、数据部分 (data)3、方法 (methods) 三、限制数量1、模板部分 (\<template>)2、数据部分 (data)3、方法…

mysql时间时区修改、set global、配置文件-default-time-zone

通过查看mysql错误日志或二进制日志可以看到时间和时区并不与国内的东八区时间一致。 查询mysql系统时区时间 show variables where variable_name"system_time_zone"; CST指的是中国标准时间&#xff0c;也是中国的标准时区。 set命令修改时区时间 global&#xf…

零基础利用实战项目学会Pytorch

目录 pytorch简介 1.线性回归 2.数据类型 2.1数据类型检验 2.2Dimension0/Rank0 2.3 Dim1/Rank1 2.4 Dim2/Rank2 3.一些方法 4.Pytorch完成分类任务 4.1模型参数 4.2 前向传播 4.3训练以及验证 4.4 三行搞定&#xff01; 4.5 准确率 5、Pytorch完成回归任务 5.…

信捷PLC转以太网连接电脑方法

信捷XC/XD/XL等系列PLC如何上下载程序?可以选择用捷米特JM-ETH-XJ模块轻松搞定,并不需要编程&#xff0c;即插即用&#xff0c;具体看见以下介绍&#xff1a; 产品介绍 捷米特JM-ETH-XJ是专门为信捷PLC转以太网通讯面设计&#xff0c;可实现工厂设备信息化需求&#xff0c;对…

【Flink】-- flink新版本发布:v2.0-preview1

目录 1、简介 2、非兼容变更 2.1、API 2.2、连接器适配计划 2.3、配置 2.4、其它 3、重要新特性 3.1、存算分离状态管理 3.2、物化表 3.3、批作业的自适应执行 3.4、流式湖仓 4、附加 4.1、非兼容性的 api 程序变更 4.1.2、Removed Classes # 4.1.3、Modified Cl…

头歌-本关任务:使用GmSSL命令行,生成SM2私钥并对文件进行签名验证(第二关)。

第一关在网上找到了&#xff0c;但第二关没找到&#xff0c;在这里做一下补充:) 如果想认真学的话可以看看文档 国密SM2椭圆曲线密码标准http://gmssl.org/docs/sm2.html 内容为 GuetPython 的明文文件msg.txt 私钥sm2.pem 公钥sm2Pub.pem 使用sm2utl对msg.txt进行签名&…

使用 unicorn 和 capstone 库来模拟 ARM Thumb 指令的执行(一)

import binascii import unicorn import capstonedef printArm32Regs(mu):for i in range(66,78):print("R%d,value:%x"%(i-66,mu.reg_read(i)))def testhumb():CODE b\x1C\x00\x0A\x46\x1E\x00"""MOV R3, R0 的机器码&#xff1a;0x1C 0x00&#xf…