Go-Gin Web 框架完整教程

1. 环境准备

1.1 Go 环境安装

Go 语言(或称 Golang)是一个开源的编程语言,由 Google 开发。在开始使用 Gin 框架之前,我们需要先安装 Go 环境。

安装步骤:

  1. 访问 Go 官网下载页面:https://golang.org/dl/
  2. 根据你的操作系统选择相应的安装包
    • Windows:下载 .msi 安装包,双击运行安装程序
    • Mac:下载 .pkg 安装包,双击运行安装程序
    • Linux:下载 tar.gz 包,解压并配置环境变量

安装完成后,打开终端输入以下命令验证安装:

go version

如果显示 Go 版本号,说明安装成功。

1.2 设置 Go 环境变量

Go 项目的工作效率很大程度上依赖于正确的环境变量配置。以下是主要的环境变量:

  • GOPATH:Go 工作空间的路径,存放 Go 项目代码和依赖包
  • GOROOT:Go 安装目录的路径
  • PATH:需要将 Go 的可执行文件目录添加到系统路径中

配置方法:

# Linux/Mac(添加到 ~/.bashrc 或 ~/.zshrc) export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin # Windows(系统环境变量) set GOPATH=C:UsersYourNamego set PATH=%PATH%;%GOPATH%bin

配置说明:

  • GOPATH 是你的工作目录,所有的 Go 项目都会在这个目录下
  • 将 $GOPATH/bin 添加到 PATH 中,这样你就能直接运行 Go 安装的工具

2. 项目初始化

2.1 创建项目目录

首先,我们需要创建一个新的项目目录。这个目录将包含我们所有的项目文件:

mkdir my-gin-app cd my-gin-app

这里 my-gin-app 是项目名称,你可以根据自己的需求修改。

2.2 初始化 Go 模块

Go 模块是 Go 管理依赖的方式。使用以下命令初始化一个新的 Go 模块:

go mod init my-gin-app

这个命令会创建一个 go.mod 文件,它用于:

  • 定义模块路径
  • 记录项目依赖
  • 控制依赖版本
2.3 安装 Gin 框架

Gin 是一个用 Go 语言编写的 Web 框架。使用以下命令安装:

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

这个命令会:

  • 下载 Gin 框架的最新版本
  • 将依赖信息添加到 go.mod 文件
  • 生成 go.sum 文件记录依赖的具体版本

注意

无法连接到 Go 的默认代理服务器。在国内访问 golang.org 经常会遇到这个问题。我们可以通过使用国内镜像源来解决:

# 设置 GOPROXY 环境变量 # Windows PowerShell $env:GOPROXY = "https://goproxy.cn,direct" # Windows CMD set GOPROXY=https://goproxy.cn,direct # Linux/Mac export GOPROXY=https://goproxy.cn,direct

设置完后,重新运行:

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

补充说明:

goproxy.cn 是七牛云提供的国内镜像源,也可以选择其他镜像:

  • https://goproxy.io
  • https://mirrors.aliyun.com/goproxy/
  • https://athens.azurefd.net

3. 项目结构

一个好的项目结构能够提高代码的可维护性和可读性。以下是推荐的项目结构:

my-gin-app/ ├── config/ # 配置文件目录 │ ├── config.go # 配置结构体定义 │ └── database.go # 数据库配置 ├── controllers/ # 控制器目录,处理请求和响应 │ ├── user.go # 用户相关控制器 │ └── product.go # 产品相关控制器 ├── middleware/ # 中间件目录 │ ├── auth.go # 认证中间件 │ └── logger.go # 日志中间件 ├── models/ # 数据模型目录 │ ├── user.go # 用户模型 │ └── product.go # 产品模型 ├── routes/ # 路由配置目录 │ └── routes.go # 路由定义 ├── services/ # 业务逻辑目录 │ ├── user.go # 用户相关业务逻辑 │ └── product.go # 产品相关业务逻辑 ├── utils/ # 工具函数目录 │ ├── jwt.go # JWT 工具 │ └── validator.go # 验证工具 ├── main.go # 应用程序入口 └── go.mod # 依赖管理文件

目录说明:

  • config:存放配置文件,如数据库连接信息、应用程序设置等
  • controllers:处理 HTTP 请求,调用相应的 service 处理业务逻辑
  • middleware:存放中间件,如登录验证、日志记录、错误处理等
  • models:定义数据模型,对应数据库表结构
  • routes:配置 URL 路由规则
  • services:实现业务逻辑
  • utils:存放通用的工具函数
  • main.go:程序入口文件

4. 基础示例

4.1 创建入口文件

入口文件main.go是应用程序的起点。下面是一个基础的示例:

package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { // 创建默认的 gin 引擎 r := gin.Default() // 定义一个简单的路由 r.GET("/", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "Hello, Gin!", }) }) // 启动服务器 r.Run(":8080") }

代码说明:

  1. gin.Default():创建一个默认的 Gin 引擎,包含了 Logger 和 Recovery 中间件
  2. r.GET("/"):定义了一个 GET 请求的路由处理器
  3. gin.Context:包含了请求的上下文信息
  4. c.JSON():返回 JSON 格式的响应
  5. r.Run(":8080"):在 8080 端口启动服务器
4.2 添加控制器

控制器负责处理具体的业务逻辑。创建controllers/user_controller.go

package controllers import ( "github.com/gin-gonic/gin" "net/http" ) // 定义用户结构体 type User struct { ID string `json:"id"` Name string `json:"name"` } // 获取用户信息 func GetUser(c *gin.Context) { id := c.Param("id") // 获取 URL 参数 user := User{ ID: id, Name: "Test User", } c.JSON(http.StatusOK, user) } // 创建新用户 func CreateUser(c *gin.Context) { var user User // 绑定 JSON 请求体到 user 结构体 if err := c.ShouldBindJSON(&user); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } c.JSON(http.StatusCreated, user) }

控制器说明:

  1. c.Param():获取 URL 参数
  2. c.ShouldBindJSON():将请求体绑定到结构体
  3. c.JSON():返回 JSON 响应
  4. HTTP 状态码的使用:
    • 200 (OK):成功获取资源
    • 201 (Created):成功创建资源
    • 400 (Bad Request):请求格式错误
4.3 配置路由

路由定义了 URL 和处理函数之间的映射关系。创建routes/routes.go

package routes import ( "my-gin-app/controllers" "github.com/gin-gonic/gin" ) func SetupRoutes(r *gin.Engine) { // 用户相关路由 userGroup := r.Group("/users") { userGroup.GET("/:id", controllers.GetUser) userGroup.POST("/", controllers.CreateUser) } }

路由说明:

  1. 路由分组:使用r.Group()创建路由组,方便管理相关的路由
  2. RESTful API 设计:
    • GET /users/:id:获取特定用户
    • POST /users:创建新用户
  3. 路由参数::id是动态参数,可以在控制器中通过c.Param("id")获取
4.4 添加中间件

中间件用于在请求处理过程中执行一些通用的操作。创建middleware/logger.go

package middleware import ( "github.com/gin-gonic/gin" "time" "log" ) func Logger() gin.HandlerFunc { return func(c *gin.Context) { startTime := time.Now() // 处理请求 c.Next() // 计算耗时 endTime := time.Now() latency := endTime.Sub(startTime) // 记录日志 log.Printf("[%s] %s %s %v", c.Request.Method, // HTTP 方法 c.Request.URL.Path, // 请求路径 c.ClientIP(), // 客户端 IP latency) // 请求耗时 } }

中间件说明:

  1. gin.HandlerFunc:中间件函数类型
  2. c.Next():调用下一个处理函数
  3. 日志记录:
    • 请求方法 (GET, POST 等)
    • 请求路径
    • 客户端 IP
    • 处理时间

5. 完整应用示例

更新main.go以整合所有组件:

package main import ( "my-gin-app/middleware" "my-gin-app/routes" "github.com/gin-gonic/gin" ) func main() { // 创建 gin 引擎 r := gin.Default() // 使用自定义中间件 r.Use(middleware.Logger()) // 设置路由 routes.SetupRoutes(r) // 启动服务器 r.Run(":8080") }

主函数说明:

  1. 引入必要的包:中间件和路由
  2. 创建 Gin 引擎
  3. 应用中间件:使用r.Use()全局应用中间件
  4. 设置路由:调用路由设置函数
  5. 启动服务器:在指定端口监听请求

6. 常用功能示例

6.1 查询参数处理
r.GET("/search", func(c *gin.Context) { query := c.Query("q") // 获取查询参数 page := c.DefaultQuery("page", "1") // 带默认值的查询参数 c.JSON(http.StatusOK, gin.H{ "query": query, "page": page, }) })
6.2 表单处理
r.POST("/form", func(c *gin.Context) { name := c.PostForm("name") email := c.PostForm("email") c.JSON(http.StatusOK, gin.H{ "name": name, "email": email, }) })
6.3 文件上传
r.POST("/upload", func(c *gin.Context) { file, _ := c.FormFile("file") // 保存文件 c.SaveUploadedFile(file, "uploads/"+file.Filename) c.JSON(http.StatusOK, gin.H{ "message": "File uploaded successfully", "filename": file.Filename, }) })
6.4 分组路由
v1 := r.Group("/api/v1") { v1.GET("/users", GetUsers) v1.POST("/users", CreateUser) } v2 := r.Group("/api/v2") { v2.GET("/users", GetUsersV2) v2.POST("/users", CreateUserV2) }

7. 数据库集成(以 GORM 为例)

首先安装 GORM:

go get -u gorm.io/gorm go get -u gorm.io/driver/mysql

创建数据库连接:

package models import ( "gorm.io/gorm" "gorm.io/driver/mysql" ) var DB *gorm.DB func InitDB() { dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("Failed to connect to database") } DB = db }

8. 测试

创建测试文件 main_test.go:

package main import ( "net/http" "net/http/httptest" "testing" "github.com/gin-gonic/gin" "github.com/stretchr/testify/assert" ) func TestPingRoute(t *testing.T) { router := setupRouter() w := httptest.NewRecorder() req, _ := http.NewRequest("GET", "/ping", nil) router.ServeHTTP(w, req) assert.Equal(t, 200, w.Code) assert.Equal(t, `{"message":"pong"}`, w.Body.String()) }

9. 部署

9.1 编译
go build -o app
9.2 运行
./app

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

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

相关文章

FlinkCDC实战:将 MySQL 数据同步至 ES

?? 当前需要处理的业务场景: 将订单表和相关联的表(比如: 商品表、子订单表、物流信息表)组织成宽表, 放入到 ES 中, 加速订单数据的查询. 同步数据到 es. 概述 1. 什么是 CDC 2. 什么是 Flink CDC 3. Flink CDC Connectors 和 Flink 的版本映射 实战 1. 宽表查询 1.1 …

从原理切入,看大模型的未来,非常详细收藏我这一篇就够了

相信大家都接触过大模型,比如 DeepSeek、豆包、ChatGPT 等生成式 AI 应用,当用户输入相关信息后,大模型就会快速输出相应的结果:文字、图片,甚至是视频。这是大家对大模型最常见的认识——效率工具。可当笔者看到25年底…

DBeaver连接本地MySQL、创建数据库表的基础操作

一、连接本地MySQL 1、新建连接 打开DBeaver,点击左上角的文件或者点击箭头所指的连接按钮。新建数据库连接-选择数据库(mysql),点击“下一步”输入服务器地址、端口、用户名、密码(数据库自己选填,不填则连接所有数据库&#xff…

docker网络模式及配置

一、Docker网络模式 docker run 创建docker容器时,可以用-net选项指定容器的网络模式,docker有以下4种网络模式: host 模式,使用-nethost指定。container模式,使用-netcontainer:NAME_or_ID指定。none模式&#xff0…

docker中配置redis

1、常规操作 docker pull redis(默认你的docker中没有redis) 2、查看redis是否拉取成功 docker images redis 3、创建目录,在你的宿主机,(我是在虚机中建的centos7)为了给redis配置文件使用 4、下载redis…

error @achrinzanode-ipc@9.2.5 The engine “node“ is incompatible with this module. 解决node.js版本不兼容问题

目录 很多人运行项目的时候会出现报错信息: 解决方案 然后再次运行就好了: 此时,我点击链接就可以看到了: 很多人运行项目的时候会出现报错信息: 这个错误是因为你的项目中使用了一个模块 achrinza/node-ipc&#…

ERROR 1524 (HY000) Plugin ‘mysql_native_password‘ is not loaded

你遇到的错误是由于 MySQL 版本不再默认支持 mysql_native_password 认证插件导致的。从 MySQL 8.0 开始,默认的认证插件是 caching_sha2_password,而不是 mysql_native_password。 解释: 错误 ERROR 1524 (HY000): Plugin mysql_native_pass…

docker下搭建redis集群

1. 环境准备 准备好Linux系统机器,并安装好docker,阅读这篇文章前请先了解清楚docker的基本知识并且会熟悉运用docker的常用命令。学习docker基础知识可以参考这篇博文 安装好并启动docker后就可以开始搭建redis了 2. docker容器下安装redis 本篇文章…

深度解析:为什么传统操作系统的最小权限原则在智能体世界失灵?

前言 如果我们把“AgentOS”理解为一种为智能体长期运行、持续决策、主动调用资源而设计的操作系统,那么它会暴露出一个根本性矛盾:我们正在用为“被动程序”设计的安全模型,去约束“主动行为体”。 传统操作系统的安全模型,无论是 Unix 时代的“用户-组-其他”,还是后来…

交通仿真软件:Aimsun_(1).Aimsun概述v1

Aimsun概述 1. Aimsun的基本功能 Aimsun是一款功能强大的交通仿真软件,广泛应用于交通规划、交通管理和交通研究等领域。它能够模拟从微观到宏观的交通流,提供详细的交通分析和优化建议。Aimsun的基本功能包括: 1.1 交通网络建模 Aimsun允许用…

ChatGLM2-6B模型推理流程和模型架构详解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1 ChatGLM是什么?2 一代GLM 2.1 大模型架构2.2 GLM特点 2 二代GLM:ChatGLM2-6B为例拆解 2.1 ChatGLM2-6B模型推理架构和流程2.2 细节详…

go桌面框架Fyne最全api文档

Fyne 是一个 Go 语言的跨平台 GUI 库 相关命令 //全局安装fyne打包工具 go install fyne.io/fyne/v2/cmd/fynelatest// 引入fyne库 go get fyne.io/fyne/v2latest go mod tidy//以窗口形式启动 go run main.go //以手机模拟器形式启动 go run -tags mobile main.go//打包 //桌面…

基于微信小程序的新能源汽车租赁换电管理系统(毕设源码+文档)

课题说明本课题聚焦基于微信小程序的新能源汽车租赁换电管理系统的设计与实现,核心目标是解决传统新能源汽车租赁及换电服务中流程繁琐、车辆与换电站信息不透明、租赁订单管理混乱、换电预约低效、电池状态监控缺失及服务进度追踪困难等痛点问题。系统深度依托微信…

交通仿真软件:Aimsun_(3).Aimsun基本操作

Aimsun基本操作 创建和配置仿真网络 在Aimsun中,创建和配置仿真网络是仿真过程的第一步。仿真网络是交通仿真的基础,它包括道路网络、交叉口、交通信号、交通流等基本元素。本节将详细介绍如何在Aimsun中创建和配置仿真网络,以及如何导入和导…

代码随想录刷题——二叉树篇(十二)

112. 路径总和 递归法: class Solution{ public:bool sumPath(TreeNode* node,int count){# 如果该节点是叶子节点且count被减到0了,那么就返回trueif(!node->left&&!node->right&&count0) return true;# 如果该节点是叶子节点且c…

代码随想录刷题——二叉树篇(十二)

112. 路径总和 递归法: class Solution{ public:bool sumPath(TreeNode* node,int count){# 如果该节点是叶子节点且count被减到0了,那么就返回trueif(!node->left&&!node->right&&count0) return true;# 如果该节点是叶子节点且c…

eclipse配置Spring

1、从eclipse下载Spring工具 进入 help – install new software… ,如下图: 点击 add ,按以下方式输入: Name : Spring Location : http://dist.springsource.com/release/TOOLS/update/e4.10/ 之后点击 add ,等待…

Go基础之环境搭建

文章目录 1 Go 1.1 简介 1.1.1 定义1.1.2 特点用途 1.2 环境配置 1.2.1 下载安装1.2.2 环境配置 1.2.2.1 添加环境变量1.2.2.2 各个环境变量理解 1.2.3 验证环境变量 1.3 包管理工具 Go Modules 1.3.1 开启使用1.3.2 添加依赖包1.3.3 配置国内包源 1.3.3.1 通过 go env 配置1.…

C#数据库操作系列---SqlSugar完结篇

1. 不同寻常的查询 之前介绍了针对单个表的查询,同样也是相对简单的查询模式。虽然开发完全够用,但是难免会遇到一些特殊的情况。而下面这些方法就是为了解决这些意料之外。 1.1 多表查询 SqlSugar提供了一种特殊的多表查询方案,使用IQueryab…

docker启动redis简单方法

1、拉取redis镜像 docker pull redis2、在本地某个位置创建以下内容 建议将以下内容放在一起,方便以后管理和查看 # 以/docker/redis为例 mkdir -p /docker/redis mkdir -p /docker/redis/data touch /docker/redis/redis.conf touch /docker/redis/redis.bash3、…