Go语言-初学者日记(七):用 Go 写一个 RESTful API 服务!
👷 实践是最好的学习方式!这一篇我们将用 Go + Gin 框架从零开始开发一个用户管理 API 服务。你将学到:
- 如何初始化项目并引入依赖
- 如何组织目录结构
- 如何用 Gin 实现 RESTful 接口
- 如何通过 curl 测试 API
- 进阶功能拓展建议
🧰 一、项目初始化与依赖安装
第一步,先创建项目目录并初始化 Go Modules:
mkdir go-user-api && cd go-user-api
go mod init github.com/yourname/go-user-api
然后安装我们将使用的 Web 框架 —— Gin:
go get -u github.com/gin-gonic/gin
✅ 你现在已经具备开发 Go Web 服务的基本环境。
📁 二、推荐的项目目录结构
保持简单,便于理解,也方便未来扩展:
go-user-api/
├── main.go # 应用入口
├── go.mod # 模块定义
├── go.sum # 依赖锁定文件
├── handlers/ # 路由处理逻辑
│ └── user.go
└── models/ # 数据模型结构体(可选)
📌 提醒:随着项目变复杂,可拆分出
service/,middleware/,config/,router/,utils/等目录。
🧪 三、实现用户 API 接口
目标是实现两个基础接口:
GET /users:返回所有用户数据POST /users:添加一个新用户
📄 main.go
package mainimport ("github.com/gin-gonic/gin""go-user-api/handlers"
)func main() {r := gin.Default()// 注册路由r.GET("/users", handlers.GetUsers)r.POST("/users", handlers.CreateUser)// 启动服务r.Run(":8080")
}
📄 handlers/user.go
package handlersimport ("net/http""github.com/gin-gonic/gin"
)// 模拟用户结构体和数据
type User struct {ID int `json:"id"`Name string `json:"name"`
}var users = []User{{ID: 1, Name: "Alice"},{ID: 2, Name: "Bob"},
}// GET /users
func GetUsers(c *gin.Context) {c.JSON(http.StatusOK, users)
}// POST /users
func CreateUser(c *gin.Context) {var newUser Userif err := c.ShouldBindJSON(&newUser); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}newUser.ID = len(users) + 1users = append(users, newUser)c.JSON(http.StatusCreated, newUser)
}
🧪 四、启动服务并测试接口
启动服务:
go run main.go
服务默认监听 http://localhost:8080
使用 curl 测试接口
📥 获取用户列表:
curl http://localhost:8080/users
📤 添加新用户:
curl -X POST http://localhost:8080/users -H "Content-Type: application/json" -d '{"name":"Charlie"}'
返回示例:
{"id": 3,"name": "Charlie"
}
🔧 五、接口设计补充说明
推荐的 RESTful 风格规范:
| 请求方法 | 路径 | 含义 |
|---|---|---|
| GET | /users | 查询所有用户 |
| GET | /users/:id | 查询单个用户 |
| POST | /users | 创建新用户 |
| PUT | /users/:id | 更新用户信息 |
| DELETE | /users/:id | 删除用户 |
这些是 RESTful 接口的基本设计规范,在大型项目中非常常见。
📦 六、进阶拓展建议
✅ 想继续提升?你可以尝试:
- 🗄 接入 GORM 实现真实数据库(SQLite / MySQL)
- ✏️ 添加表单校验:使用 Gin 的
binding+validator - 🔐 增加登录、注册与 JWT 身份认证
- 🧪 编写单元测试(使用
httptest.NewRecorder()) - 🛡️ 使用中间件做访问日志、限流、错误恢复等处理
- 📂 添加日志框架如
zap,记录结构化日志 - 📚 提取配置文件(使用
viper管理 YAML/JSON)
🧠 七、小结与回顾
本篇我们完成了一个完整的 Go + Gin 实战项目的搭建和基本功能实现。你已经学到了:
- 如何初始化 Go 项目并安装依赖
- 如何用 Gin 实现基础的 API 路由与处理
- 如何通过 curl 工具测试接口
- 如何组织项目目录结构以支持未来拓展
📌 实战才是学习的核心,加油!后续我们会继续介绍部署与上线技巧 🚀
🪧 下一篇预告
🚀 Go语言-初学者日记(八):部署与构建——Go 项目上线指南
包括go build编译、Docker 打包、环境变量配置、部署上线等内容,敬请期待!
相关文章:
Go语言-初学者日记(七):用 Go 写一个 RESTful API 服务!
👷 实践是最好的学习方式!这一篇我们将用 Go Gin 框架从零开始开发一个用户管理 API 服务。你将学到: 如何初始化项目并引入依赖如何组织目录结构如何用 Gin 实现 RESTful 接口如何通过 curl 测试 API进阶功能拓展建议 🧰 一、项…...
Java 搭建 MC 1.18.2 Forge 开发环境
推荐使用 IDEA 插件 Minecraft Development 进行创建项目 创建完成后即可进行 MOD 开发。 但是关于 1.18.2 的开发教程太少,因此自己研究了一套写法,写法并非是最优的但是是探索开发MOD中的一次笔记和记录 GITHUB: https://github.com/zimoyin/zhenfa…...
计算机网络知识点汇总与复习——(三)数据链路层
Preface 计算机网络是考研408基础综合中的一门课程,它的重要性不言而喻。然而,计算机网络的知识体系庞大且复杂,各类概念、协议和技术相互关联,让人在学习时容易迷失方向。在进行复习时,面对庞杂的的知识点,…...
Verilog HDL 100道面试题及参考答案
目录 Verilog HDL 的四种基本逻辑值是什么? 关键字 reg 和 wire 的主要区别是什么? 解释阻塞赋值(=)与非阻塞赋值(<=)的区别,并举例说明。 如何声明一个双向端口(inout)? 位拼接操作符是什么?举例说明其用法。 拼接信号和常量 拼接常量和信号 重复拼接 以…...
内网(域)渗透测试流程和模拟测试day--5--Windows和Linux的提权
前景: 小知识: 认识一下土豆家族 是指一系列利用 Windows 系统漏洞实现提权的工具或方法,起源于 JuicyPotato。这些工具大多利用 COM 对象和服务中的权限提升漏洞,主要用于在 Windows 环境中从中低权限(如普通用户&…...
主机和虚拟机间的网络通信
参考:Vmware虚拟机三种网络模式详解 - 林加欣 - 博客园 (cnblogs.com) 虚拟机配置 一般额外配置有线和无线网络 桥接模式 虚拟机和主机之间是同一个网络,用一根线连接了虚拟机和物理机的网卡,可以选择桥接的位置,默认情况下是自动桥接&…...
嵌入式Linux开发环境搭建,三种方式:虚拟机、物理机、WSL
目录 总结写前面一、Linux虚拟机1 安装VMware、ubuntu18.042 换源3 改中文4 中文输入法5 永不息屏6 设置 root 密码7 安装 terminator8 安装 htop(升级版top)9 安装 Vim10 静态IP-虚拟机ubuntu11 安装 ssh12 安装 MobaXterm (SSH)…...
说清楚单元测试
在团队中推行单元测试的时候,总是会被成员问一些问题: 这种测试无法测试数据库的SQL(或者是ORM)是否执行正确?这种测试好像没什么作用?关联的对象要怎么处理呢?…借由本篇,来全面看一看单元测试。 单元测试是软件开发中一种重要的测试方法,其核心目的是验证代码的最小…...
如何分析 jstat 统计来定位 GC?
全文目录: 开篇语前言摘要概述jstat 的核心命令与参数详解基本命令格式示例 jstat 输出解读主要字段含义 典型 GC 问题分析案例案例 1:年轻代 GC 过于频繁案例 2:老年代发生频繁 Full GC案例 3:元空间(Metaspace&#…...
电商---part02 项目环境准备
1.虚拟机环境 可以通过VMWare来安装,但是通过VMWare安装大家经常会碰到网络ip连接问题,为了减少额外的环境因素影响,Docker内容会通过VirtualBox结合Vagrant来安装虚拟机。 VirtualBox官网:https://www.virtualbox.org/ Vagran…...
LabVIEW提升程序响应速度
LabVIEW 程序在不同计算机上的响应速度可能存在较大差异,这通常由两方面因素决定:计算机硬件性能和程序本身的优化程度。本文将分别从硬件配置对程序运行的影响以及代码优化方法进行详细分析,帮助提升 LabVIEW 程序的执行效率。 一、计算机硬…...
工业领域网络安全技术发展路径洞察报告发布 | FreeBuf咨询
工业网络安全已成为国家安全、经济稳定和社会运行的重要基石。随着工业互联网、智能制造和关键基础设施的数字化升级,工业系统的复杂性和互联性显著提升,针对工业领域的网络攻击朝着目标多样化、勒索攻击产业化、攻击技术持续升级的方向发展,…...
WPF 登录页面
效果 项目结构 LoginWindow.xaml <Window x:Class"PrismWpfApp.Views.LoginWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.…...
【数学建模】动态规划算法(Dynamic Programming,简称DP)详解与应用
动态规划算法详解与应用 文章目录 动态规划算法详解与应用引言动态规划的基本概念动态规划的设计步骤经典动态规划问题1. 斐波那契数列2. 背包问题3. 最长公共子序列(LCS) 动态规划的优化技巧动态规划的应用领域总结 引言 动态规划(Dynamic Programming,简称DP)是一…...
leetcode-代码随想录-链表-移除链表元素
题目 链接:203. 移除链表元素 - 力扣(LeetCode) 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 输入:head [1,2,6,3,4,5,6], val 6 …...
低成本训练垂直领域文娱大模型的技术路径
标题:低成本训练垂直领域文娱大模型的技术路径 内容:1.摘要 在文娱产业快速发展且对智能化需求日益增长的背景下,为降低垂直领域文娱大模型的训练成本,本研究旨在探索低成本训练的有效技术路径。采用对现有开源模型进行微调、利用轻量化模型架构以及优化…...
Spring Boot 3.4.3 基于 Caffeine 实现本地缓存
在现代企业级应用中,缓存是提升系统性能和响应速度的关键技术。通过减少数据库查询或复杂计算的频率,缓存可以显著优化用户体验。Spring Boot 3.4.3 提供了强大的缓存抽象支持,而 Caffeine 作为一款高性能的本地缓存库,因其优异的吞吐量和灵活的配置,成为许多开发者的首选…...
手机为电脑提供移动互联网络的3种方式
写作目的 在当今数字化时代,电脑已成为人们日常工作和生活中不可或缺的工具,而网络连接更是其核心功能之一。无论是处理工作任务、进行在线学习、还是享受娱乐资源,稳定的网络环境都是保障这些活动顺利开展的关键。然而,在实际使用过程中,电脑网络驱动故障时有发生,这可…...
论文阅读Diffusion Autoencoders: Toward a Meaningful and Decodable Representation
原文框架图: 官方代码: https://github.com/phizaz/diffae/blob/master/interpolate.ipynb 主要想记录一下模型的推理过程 : %load_ext autoreload %autoreload 2 from templates import * device cuda:1 conf ffhq256_autoenc() # pri…...
Python集合(五)
集合一: 跟字典一样,最大的特性就是唯一性,集合中的所有的元素都是独一无二的,并且还是无序的 创建集合 第一种: 第二种:集合推导式: 第三种:使用类型构造器: 集合是无…...
ISIS多区域配置
一、什么是ISIS多区域 ISIS(Intermediate System to Intermediate System)多区域是指网络被划分为多个逻辑区域(Areas),不同区域之间通过特定的ISIS路由器(Level-1-2)进行路由交互。多区域设计提…...
2025-04-04 Unity 网络基础5——TCP分包与黏包
文章目录 1 分包与黏包2 解决方案2.1 数据接口2.2 定义消息2.3 NetManager2.4 分包、黏包处理 3 测试3.1 服务端3.2 客户端3.3 直接发送3.4 黏包发送3.5 分包发送3.6 分包、黏包发送3.7 其他 1 分包与黏包 分包、黏包指在网络通信中由于各种因素(网络环境、API …...
Leetcode——150. 逆波兰表达式求值
题解一 思路 和上一期1047. 删除字符串中的所有相邻重复项没差太多,基本思想都一样,就是读取输入的数据,如果是运算符,就进行相应的运算,然后把运算结果压栈。 代码 class Solution {public int evalRPN(String[] …...
【Node】一文掌握 Express 的详细用法(Express 备忘速查)
文章目录 入门Hello Worldexpress -hexpress()RouterApplicationRequest属性方法 Response属性方法 示例RouterResponseRequestres.end()res.json([body])app.allapp.deleteapp.disable(name)app.disabled(name)app.engine(ext, callback)app.listen([port[, host[, backlog]]]…...
chromium魔改——绕过无限debugger反调试
在进行以下操作之前,请确保已完成之前文章中提到的 源码拉取及编译 部分。 如果已顺利完成相关配置,即可继续执行后续操作。 在浏览器中实现“无限 debugger”的反调试技术是一种常见的手段,用于防止他人通过开发者工具对网页进行调试或逆向…...
Spring 核心技术解析【纯干货版】- XVI:Spring 网络模块 Spring-WebMvc 模块精讲
在现代 Web 开发中,高效、稳定、可扩展的框架至关重要。Spring WebMvc 作为 Spring Framework 的核心模块之一,为开发人员提供了强大的 MVC 体系支持,使得 Web 应用的构建更加便捷和规范。无论是传统的 JSP 视图渲染,还是基于 RES…...
【GPT入门】第33课 从应用场景出发,区分 TavilyAnswer 和 TavilySearchResults,代码实战
【GPT入门】第33课 从应用场景出发,区分 TavilyAnswer 和 TavilySearchResults,代码实战 1. 区别应用场景 2. 代码使用3.代码执行效果 在langchain_community.tools.tavily_search中,TavilyAnswer和TavilySearchResults有以下区别和应用场景&…...
JS dom修改元素的style样式属性
1通过样式属性修改 第三种 toggle有就删除 没就加上...
灭火器离位检测:智能视觉守护安全
利用视觉分析实现明火检测:技术、功能与应用 一、背景 清明节期间,兰州市连续发生多起因祭祖烧纸引发山火的警情,如七里河区魏岭乡赵某某等人上坟烧纸未妥善处理烛火引燃杂草,导致3人烧伤;七里河区彭家坪石板山村村民…...
网络:华为数通HCIA学习:IP路由基础
华为HCIA学习 IP路由基础路由协议或路由种类以及对应路由的优先级按工作区域分类:按工作机制及算法分类:路由的优先级路由器选择最优路由的顺序是什么? 前言自治系统LAN和广播域路由选路IP路由表路由度量建立路由表最长匹配原则路由器转发数据包总结 IP…...
