TMDOG的Gin学习笔记_01——初识Gin框架

TMDOG的Gin学习笔记_01——初识Gin框架

博客地址:[TMDOG的博客](https://blog.tmdog114514.icu)

作者自述:
停更太久了,是因为开学了课太多了,并且我一直在准备上篇文章的内容正在coding,就先搁置了更新博客QAQ,现在终于闲下来了。

​ 说实话挺久没有进行golang的编程了,但以前上课系统学习了golang并且期末项目就是使用beego实现的[CRM管理系统](https://gitee.com/mbjdot/biego-final-project)(可以康康),所以上手gin还是比较快的。

学习目标

使用Gin框架实现一个微服务,并整合到上篇博客的项目中。
预期将会使用的技术栈: Gin、GORM、Postgres、gRPC、Docker

Gin快速入门

1. 安装Gin

首先,确保你已安装Go。然后使用以下命令安装Gin:

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

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

在你的项目目录下,创建一个新的Go文件,例如main.go,并添加以下代码:

package mainimport ("github.com/gin-gonic/gin"
)func main() {// 创建一个默认的Gin路由r := gin.Default()// 设置一个简单的GET路由r.GET("/", func(c *gin.Context) {c.JSON(200, gin.H{"message": "hello gin",})})// 启动服务器,监听在8080端口r.Run(":8080")
}

3. 运行你的应用

在终端中,运行以下命令启动你的应用:

go run main.go

4. 测试API

打开你的浏览器或使用工具(如Postman或curl),访问 http://localhost:8080/。你应该会看到以下JSON响应:

请添加图片描述

Gin整合GORM

1. 安装GORM依赖

使用go get命令安装GORM和Postgres驱动的依赖:

go get gorm.io/gorm
go get gorm.io/driver/postgres

2. 初始化数据库连接并构建表模型

以用户表为例进行初始化:

// User模型
type User struct {ID    uint   `gorm:"primaryKey;autoIncrement"`Name  string `gorm:"not null"`Email string `gorm:"not null"`
}var db *gorm.DBfunc init() {// 数据库连接信息dsn := "host=localhost user=postgres password=123456 dbname=postgres port=5432 sslmode=disable TimeZone=Asia/Shanghai"var err error// 连接数据库db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})if err != nil {panic("failed to connect to database")}// 自动迁移(将在数据库中创建表)db.AutoMigrate(&User{})
}

3. 编写接口

实现对用户表的增删改查接口:

// 创建用户
r.POST("/users", func(c *gin.Context) {var user Userif err := c.ShouldBindJSON(&user); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}db.Create(&user)c.JSON(http.StatusCreated, user)
})// 获取所有用户
r.GET("/users", func(c *gin.Context) {var users []Userdb.Find(&users)c.JSON(http.StatusOK, users)
})// 根据ID获取用户
r.GET("/users/:id", func(c *gin.Context) {var user Userid := c.Param("id")if err := db.First(&user, id).Error; err != nil {c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})return}c.JSON(http.StatusOK, user)
})// 更新用户
r.PUT("/users/:id", func(c *gin.Context) {var user Userid := c.Param("id")if err := db.First(&user, id).Error; err != nil {c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})return}if err := c.ShouldBindJSON(&user); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}db.Save(&user)c.JSON(http.StatusOK, user)
})// 删除用户
r.DELETE("/users/:id", func(c *gin.Context) {id := c.Param("id")if err := db.Delete(&User{}, id).Error; err != nil {c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})return}c.Status(http.StatusNoContent)
})

4. 测试

使用Postman或curl测试API:

  • 创建用户:

    curl -X POST http://localhost:8080/users -H "Content-Type: application/json" -d '{"name":"Alice", "email":"alice@example.com"}'
    
  • 获取所有用户:

    curl -X GET http://localhost:8080/users
    
  • 获取单个用户:

    curl -X GET http://localhost:8080/users/1
    
  • 更新用户:

    curl -X PUT http://localhost:8080/users/1 -H "Content-Type: application/json" -d '{"name":"Alice Updated", "email":"alice.updated@example.com"}'
    
  • 删除用户:

    curl -X DELETE http://localhost:8080/users/1
    

5. 测试结果

请添加图片描述

总结

通过本篇学习笔记,我们初步了解了gin的基本用法,包括如何安装、创建简单的Web应用以及整合gorm进行数据库操作。我们实现了一个用户管理的RESTful API,能够完成基本的增删改查功能。我们发现gin是一个非常简洁的一个框架,几行代码就可以构建一个Web应用,和express.js有着异曲同工之妙。接下来我会继续分享我的学习笔记,尽请期待。

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

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

相关文章

H7-TOOL的CAN/CANFD助手增加帧发送成功标识支持, 继续加强完善功能细节

2.27版本固件正式携带此功能,包括之前做的负载率检测和错误信息展示也将集成到这个版本固件中。 对于接收,我们可以直接看到效果,而发送不行,所以打算在发送的地方展示下发送成功标识。CAN发送不像串口,需要等待应答后…

Pr 视频效果:超级键

视频效果/键控/超级键 Keying/Ultra Key 超级键 Ultra Key效果是 Premiere Pro 中功能强大的抠像工具,主要用于绿幕/蓝幕抠像。通过选择要抠除的颜色(通常是绿幕或蓝幕的颜色),即可以将该颜色的像素设为透明,实现主体与…

善用Git LFS来降低模型文件对磁盘的占用

将讲一个实际的例子:对于模型文件,动辄就是好几个G,而有的仓库更是高达几十G,拉一个仓库到本地,稍不注意直接磁盘拉满都有可能。 比如:meta-llama-3.1-8b-instruct,拉到本地后发现居然占用了60G…

「树链剖分」学习笔记

一、引入 “在一棵树上进行路径的修改、求极值、求和”乍一看只要线段树就能轻松解决,实际上,仅凭线段树是不能搞定它的。我们需要用到一种貌似高级的复杂算法——「树链剖分」。 树链剖分(简称树剖),顾名思义&#xf…

Golang--数组、切片、映射

1、数组 1.1 数组类型 var 数组名 [数组大小]数据类型 package main import "fmt"func main(){//1、定义一个数组var arr1 [5]intarr1[0] 100arr1[1] 200fmt.Println(arr1) //[100 200 0 0 0] } 1.2 数组的初始化方式 package main import "fmt" func …

结构体对齐,位段

大家好,今天来给大家分享一些结构体的知识,结构体是我们学习数据结构的基础,只有把它了解清楚才能让我们学习数据结构是得心应手,现在让我们来看看它的一些内容吧。 1.结构体的定义和调用我们就跳过吧 大家如果还不熟悉的话可以去…

ElementUI中el-table双击单元格显示输入框

效果图 实现 <el-table:data"formData.products"row-key"id":show-header"true"style"width: 100%; margin-top: 16px"class"zq-table-theme-info"bordercell-dblclick"handleDbClick"> <el-table-col…

Python OpenCV 图像改变

更改图像数据 通过 改像素点 或者 切片的区域 import cv2 import numpy as np img cv2.imread("image.jpg") print(img[3,5]) # 显示某位置(行3列5)的像素值( 如 [53 34 29] 它是有三通道 B G R 组成) img[3,5] (0,0,255) # 更改该位置的像素…

学习虚幻C++开发日志——定时器

官方文档&#xff1a;虚幻引擎中的Gameplay定时器 | 虚幻引擎 5.5 文档 | Epic Developer Community | Epic Developer Community 定时器 安排在经过一定延迟或一段时间结束后要执行的操作。例如&#xff0c;您可能希望玩家在获取某个能力提升道具后变得无懈可击&#xff0c;…

网络安全设备Bypass功能介绍及分析

网络安全平台厂商往往需要用到一项比较特殊的技术&#xff0c;那就是Bypass&#xff0c;那么到底什么是Bypass呢&#xff0c;Bypass设备又是如何来实现的&#xff1f;下面我就对Bypass技术做一下简单的介绍和说明。 一、 什么是Bypass。 大家知道&#xff0c;网络安全设备一般…

如何更改Android studio的项目存储路径

如果你希望永久更改Android Studio的默认项目保存路径&#xff0c;可以通过以下步骤进行设置&#xff1a; 打开Android Studio&#xff0c;选择“File”菜单下的“Settings”&#xff08;Windows&#xff09;或“Preferences”&#xff08;Mac&#xff09;。在设置窗口中&…

ESP8266 自定义固件烧录-mqtt透传固件

esp8266 mqtt固件配网及使用说明_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV196421G7Xc/?spm_id_from333.999.0.0一、固件介绍 固件为自定义开发的一个适配物联网项目的开源固件&#xff0c;支持网页配网、支持网页mqtt服务器配置、支持主题设置。 方便、快捷、稳…

二十三、Mysql8.0高可用集群架构实战

文章目录 一、MySQL InnoDB Cluster1、基本概述2、集群架构3、搭建一主两从InnoDB集群3.1、 安装3个数据库实例3.2、安装mysqlrouter和安装mysqlshell3.2.1、安装mysql-router3.2.2、安装mysql-shell 3.3、InnoDB Cluster 初始化3.1 参数及权限配置预需求检测3.2 初始化InnoDB …

[OS] mmap() 函数的参数及其作用

参数说明&#xff1a; addr&#xff1a;映射区域的起始地址。如果设置为 0&#xff0c;则由内核自动选择页对齐的地址。length&#xff1a;需要映射的字节数&#xff0c;决定映射的区域大小。prot&#xff1a;映射区域的内存保护属性&#xff0c;如只读、可读写等。这个属性不…

meta-learning based FD论文阅读笔记

[1]Semi-Supervised Temporal Meta-Learning Framework for Wind Turbine Bearing Fault Diagnosis Under Limited Annotation Data 问题背景 the fault data are so scarce that it is time-consuming to acquire a well behaved deep learning modelmuch unlabeled data ca…

web渗透——小白入狱

目录 理论知识总结一、Web渗透核心知识点二、Web渗透实操案例三、Web渗透学习建议实操案例一、信息收集实操步骤&#xff1a; 二、SQL注入实操步骤&#xff1a; 三、跨站脚本攻击&#xff08;XSS&#xff09;实操步骤&#xff1a; 四、CSRF攻击实操步骤&#xff1a; 五、本地文…

一个完整的产品级物联网系统在农业领域的应用,通过传感器、通信、云计算和控制设备的协同工作,实现了智能化的农业灌溉管理

以下为您详细介绍一个智能农业灌溉系统作为产品级的物联网实际案例&#xff1a; **一、项目背景** 随着农业现代化的发展&#xff0c;精准灌溉对于提高农作物产量、节约水资源具有重要意义。传统的灌溉方式往往依赖人工经验&#xff0c;效率低下且浪费水资源。因此&#xff0c…

JeecgBoot入门

最近在了解低代码平台&#xff0c;其中关注到gitee上开源项目JeecgBoot&#xff0c;JeecgBoot官方也有比较完整的入门教学文档&#xff0c;这里我们将耕者官方教程学习&#xff0c;并将其记录下来。 一、项目简介 JeecgBoot 是一款基于代码生成器的低代码开发平台拥有零代码能力…

qt QEvent详解

1、概述 QEvent是Qt框架中事件机制的基础类。在Qt中&#xff0c;事件是由底层窗口系统&#xff08;如Windows、Linux的X11、macOS的Cocoa等&#xff09;生成的&#xff0c;Qt的主事件循环&#xff08;QCoreApplication::exec()&#xff09;负责从事件队列中获取这些事件&#…

#Jest进阶知识:整合 webpack 综合练习

这一小节&#xff0c;我们来做一个综合的练习&#xff0c;该练习会整合&#xff1a; typescriptwebpackjest 准备工作 首先创建项目目录&#xff0c;通过 npm init -y 进行初始化。 整个项目我们打算使用 typescript 进行开发&#xff0c;因此需要安装 typescript npm i t…