Gin笔记一之项目建立与运行

news/2025/10/23 23:22:27/文章来源:https://www.cnblogs.com/hunterxiong/p/19161846

本文首发于公众号:Hunter后端

原文链接:Gin笔记一之项目建立与运行

本篇笔记开始介绍 Golangweb 框架 Gin 的相关内容。

本系列笔记预计通过四到五篇笔记内容介绍 Gin 框架的核心内容,然后通过一个简单的示例介绍一个 Gin 项目的目录结构,然后介绍如何将一个 Gin 项目使用 Docker 打包部署。

此外,还将介绍在 Gin 项目里连接使用 RedisMongoMySQL 等操作。

以下是本篇笔记内容:

  1. 模块安装
  2. 项目运行
  3. 接口返回参数
  4. 运行模式

1、模块安装

创建一个文件夹 gin_proj,然后进入该文件夹执行 go mod init gin_proj 初始化 Go 模块。

然后安装 gin 模块:

go get github.com/gin-gonic/gin

2、项目运行

我们在 gin_proj 文件夹下创建一个 main.go 文件,然后定义一个接口,然后返回数据的代码如下:

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

然后在浏览器中或者使用 postman 访问 http://localhost:9898/test 就可以看到对应的结果输出。

其代码释义如下。

1. gin.Default()

gin.Default() 返回的类型是 *gin.Engine,我们可以用其定义路由和分组,设置 HTTP 请求类型,比如这里的 r.GET() 以及后面将要介绍的路由组。

2. r.GET()

r.GET() 用于设置请求的方式,比如这里是 GET 请求,如果是 post 请求可以使用 r.POST()

GET() 方法接收两个参数,第一个参数是路由,比如这里是 /test,第二个参数是个可变参数,...HandlerFunc,可接收多个 HandlerFunc 类型,此类型是一个函数,接收 *gin.Context 参数,其定义如下:

type HandlerFunc func(*Context)

这里的第二个参数,除了路由的处理函数,我们还可以在其中加上中间件处理。

在上面的代码示例中,第二个参数用的是匿名函数,我们还可以直接将这个函数提出去:

func TestHandler(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"code": 0, "message": "success"})
}func main() {r := gin.Default()r.GET("/test", TestHandler)r.Run(":9898")
}

3. r.Run()

r.Run() 接收运行时使用的端口,这里传入的是 :9898,表示运行在 9898 端口。

如果不传入参数,默认使用 8080 端口。

Run() 还返回一个 err 参数,表示运行时 error

err := r.Run(":9898")
if err != nil {fmt.Println("gin run in 9898 error:", err)
}

3、接口返回参数

在上面 TestHandler 函数中,接收的参数是 *gin.Context,我们可以使用其处理请求流程,获取请求数据,处理响应,上下文数据传递等,这个在后面做具体的介绍。

这里返回的代码如下:

c.JSON(http.StatusOK, gin.H{"code": 0, "message": "success"})

1. c.JSON()

c.JSON() 这里返回的是 /test 接口的内容,接收两个参数,第一个是状态码,也就是 HTTP 状态码,比如 200、404 这种。

第二个参数的类型是 any,接收任意类型的数据,我们这里返回的是 gin.H{},这个在后面再介绍。

这里的 c.JSON() 是用于向客户端返回 json 格式的数据,会将第二个参数序列化后返回。

除了 c.JSON() 外,我们还可以使用 c.String() 返回纯文本,c.HTML() 返回 HTML 页面,和其他的 c.File() 返回文件等操作。

2. http.StatusOK

http.StatusOKnet/http 模块下表示 HTTP 状态码的常量,其值为 200,在 c.JSON(),我们也可以直接使用 200 作为返回值。

c.JSON(200, gin.H{"code": 0, "message": "success"})

除了 http.StatusOK,还有其他 2xx,3xx,4xx,5xx 等状态码在该模块下都有定义,这里就不赘述了。

3. gin.H{}

gin.H 类型是一个 map,其定义如下:

type H map[string]any

除了像上面一个对返回的字段挨个进行赋值,我们还可以直接返回一个 struct 类型。

type TestResponse struct {Code    int    `json:"code"`Message string `json:"message"`
}func TestHandler(c *gin.Context) {response := TestResponse{Code:    0,Message: "success",}c.JSON(http.StatusOK, response)
}

4、运行模式

gin 里一共定义了三种模式,分别是 debugreleasetest,其定义如下:

const (// DebugMode indicates gin mode is debug.DebugMode = "debug"// ReleaseMode indicates gin mode is release.ReleaseMode = "release"// TestMode indicates gin mode is test.TestMode = "test"
)

系统默认运行模式是 debug 模式,当我们直接运行 go run main.go 时,其输出信息如下:

[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.- using env:   export GIN_MODE=release- using code:  gin.SetMode(gin.ReleaseMode)[GIN-debug] GET    /test                     --> main.main.func1 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :9898

会输出当前的运行模式,可以访问的接口等信息,这里第一行的输出还介绍了我们使用的 r := gin.Default() 会默认使用 Logger and Recovery 两个中间件,这个后面在介绍 gin.Engine 的再详细介绍。

而如果我们设置运行模式为 release 模式,控制台仅仅会在访问接口的时候输出一条访问信息,包括访问时间、耗时、请求方式和访问的接口名称:

[GIN] 2025/08/19 - 00:32:09 | 200 |     140.916µs |             ::1 | GET      "/test"

设置运行模式

我们可以通过下面的方法获取和设置运行模式:

// 获取运行模式
gin.Mode()// 设置运行模式
gin.SetMode(gin.ReleaseMode)

gin 在运行时,会先加载系统环境变量 GIN_MODE,然后根据获取的值将系统设置为对应的模式。

所以我们在部署系统时,如果是以 Docker 形式部署,可以设置此变量来设置对应的运行模式。

declare -x GIN_MODE="release"

也可以在 main.go 中直接设置:

gin.SetMode(gin.ReleaseMode)

以上就是本篇笔记全部内容,主要介绍了 gin 框架的运行方式,并介绍了一个简单示例如何设置接口并返回,还有 gin 的系统模式设置,接下来几篇笔记将详细介绍 gin.Engine 与路由的相关操作,gin.Context 与响应处理,中间件等设置。

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

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

相关文章

【题解】P14254 分割(divide)

想了想,感觉这道题还是总结一下为好。 这个题需要涉及大量证明,也是很恶心人了。 引理一:当第 \(1\) 个点选择了深度为 \(i\),那后续所有节点的深度就只能为 \(i\)。 证明:因为选择的点的深度是不降得,所以不能选…

10.23日学习笔记

一、应用层在 TCP/IP 中的位置 最顶层,直接为用户的应用程序提供网络服务。 不关心底下几层如何传输,只关心“消息语义”与“交换规则”。 典型交互模型: 客户/服务器(C/S) P2P(对等) 混合(边缘 P2P + 索引服务…

埃氏筛及扩展质因数筛——埃拉托斯特尼筛法变种

质数筛这段代码用 “埃拉托斯特尼筛法” 找 2 到 N 之间的所有素数,逻辑很直接:先假设所有数都是素数(用vis数组标记,初始全为true); 排除 0 和 1(它们不是素数,标记为false); 从 2 开始,对每个没被排除的数…

Day2路径,相对与绝对

路径指的是查找文件时,从起点到终点经历的路程 路径也分为绝对路径与相对路径 相对路径是从当前文件出发查找目标额文件 绝对路径是从盘符出发找目标文件 Windows电脑是从盘符出发的,而Mac电脑则是从根目录出发 在…

第九届强网杯线上赛PWN_flag-market

第九届强网杯线上赛PWN_flag-market第九届强网杯线上赛PWN_flag-market 一、题目二、信息搜集 下载题目给的附件,查看文件ctf.xinetd之后,知道我们的可执行程序名为chall:这个文件在附件中的bin目录下。 通过file命…

ISFB银行木马家族演化史:从Gozi到LDR4的技术剖析

本文深入分析ISFB银行木马家族十年演化历程,详细解析其技术架构、功能模块和分支变种,包括加载器、键盘记录、Web注入、VNC远程控制等核心功能,揭示网络犯罪组织的运作模式和技术演进。第1章 — 从Gozi到ISFB:一个…

exgcd板子

void exgcd(int &x,int &y,int a,int b) {if(!b){x=1;y=0;return;}exgcd(x,y,b,a%b);int t=x;x=y;y=t-a/b*y; }

2025.10.23

今天上午算法与数据结构的早八,然后跆拳道前半节课训练,后半节课进行体测,我对这次的成绩非常满意,中午没有点外卖,去食堂买了一个饼,回宿舍休息睡觉,晚上去科技楼制作本周六竞赛的PPT,一直到10点半。

Codeforces Round 976 (Div. 2) A. Find Minimum Operations

这个问题实际上是K进制取位和: 举例:2进制 n=110100 使用几次2的x次幂可以将n置0,ans=3 10进制 n=9924 使用几次10的x次幂可以将n置0,ans=9+9+2+4 k进制也相同 ,代码如下: `#include <bits/stdc++.h> using nam…

102302142罗伟钊第一次作业

1. 作业①: **1)、核心代码与输出 ** o 要求:用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。代码是一个大学排名数…

一个基于 .NET 开源、功能强大的分布式微服务开发框架

前言 今天大姚给大家分享一个基于 .NET 开源、功能强大的分布式微服务开发框架:Anno.Core。Anno.Core 项目介绍 Anno.Core 是一个基于 .NET 开源、功能强大的分布式微服务开发框架,致力于简化分布式、微服务系统的构…

UE4学习笔记

基本操作窗口这里可以打卡很多视口设置可以通过设置书签到自己想要的视角视口世界大纲

20251021 NOIP模拟赛

T2 题目大意; 有一棵大小为 \(n\) 的树和 \(m\) 个关键点,你要从这 \(m\) 个关键点中随机选择 \(k\) 个点,问这 \(k\) 个点两两之间最长距离的期望是多少。 \(n \le 2000, m \le 300\) 解题思路: 最暴力的做法肯定…

RocketMQ+Spring Boot的简单实现及其深入分析

Producer搭建导入RocketMQ依赖和配置RocketMQ地址及producer的group:name<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId>…

xcode程序创建文件存储位置

xcode创建的文件不在cpp文件所在位置,经过查找发现在下面这个地方/Users/用户名/Library/Developer/Xcode/DerivedData/employeesystem-dlmmqxmyqxjljjcoskekmpsbtstd/Build/Products/Debug employeesystem是项目名称…

欧拉操作系统搭建docker

欧拉安装dockerdocker官方没有支持欧拉的,因此使用的是centos7的docker源2者底层是类似的1、配置yum源和安装docker yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.re…

关于2025年暑假自主巡航小车脚本文件的学习笔记

脚本:gnome-terminal --window -e bash -c "roscore; exec bash" \ gnome-terminal命令用于新建一个GNOME桌面环境的终端程序(顶级窗口) 选项--window,新建一个窗口与默认行为一致(属于是显式写法,提高…

3dmax下载安装教程及激活教程(附安装包)3dmax2025超详细下载安装步骤

很多新手想装 3dmax 2025 却不知道从哪下手,别担心,这份 3dmax 2025 详细安装教程从下载到激活,再到软件用法,一步一步教你,保证看了就会,轻松解决 3dmax 2025 安装难题。目录3dmax 2025 到底好用在哪?3dmax 20…

RFSOC学习记录(五)带通采样定理

RFSOC学习记录(五),在配置adda的混频模式之前通过公式推导介绍了带通采样定理以及奈奎斯特分区​花了三篇文章的时间大致讲了讲我对于rfsoc时钟树的理解,非常的浅薄与浅应用,现在我再从原理层面记录一下我对于rf …

66页作业

点击查看代码 import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as np# 设置设备 d…