Go之Web急速入门Gin+Gorm框架
简介
只作为快速入门、了解Go的Gin+Gorm框架的demo,不能作为企业级开发。
详细用法请看官网
《Gin官网》
《Gorm官网》
使用GoLand创建Go项目(默认modules)
go版本1.22.2
需要设置代理下载go相关软件包,否则软件包可能无法下载。
https://goproxy.cn
目录结构
go.mod就是管理相关软件的版本信息,如果你学习过Java,可以简单理解mod就是maven、gradle等构建工具
安装 Gin + Gorm 软件包
控制台执行以下三条命令,否则启动会报错。
gin web框架
gorm orm框架
gorm mysql 数据库驱动
go get -u github.com/gin-gonic/gin
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
创建mysql数据库
创建main.go文件
go有且仅有一个main函数,这个是跟java不太一样的地方,java是允许有多个main函数的。
//包的概念
package main//引入的包路径
import ("fmt""github.com/gin-gonic/gin""gorm.io/driver/mysql""gorm.io/gorm""net/http""path""time"
)//定义一个结构体
type UserInfo struct {gorm.Model //gorm模型默认包含 ID、CreatedAt、UpdatedAt、DeletedAt 4个变量Username string `gorm:"index" form:"username" json:"username" binding:"required"`Password string `form:"password" json:"password" binding:"required"`
}// 自定义 gin 中间件 MyHandlerFunc
func MyHandlerFunc(invoke bool) gin.HandlerFunc {return func(c *gin.Context) {if invoke {fmt.Println("请求开始......")start := time.Now()//在请求上下文中设置值,后续的处理函数可以获取到该值c.Set("token", "1")token, ok := c.Get("token")if !ok {c.JSON(http.StatusUnauthorized, gin.H{"code": http.StatusUnauthorized,"message": "未授权",})return}fmt.Printf("token = %v\n", token)c.Next()//c.Abort()表示阻止代码继续往下执行//c.Abort()//计算请求耗时cost := time.Since(start)fmt.Println("请求耗时:", cost)fmt.Println("请求结束......")} else {c.Next()}}
}//main函数
func main() {//0.在控制台输入 go get -u github.com/gin-gonic/gin 安装 Gin 软件包//返回默认路由引擎r := gin.Default()//指定用户使用GET请求访问/hello,并执行匿名函数,返回JSON格式map[string]的数据//1.返回map(一般用于临时返回,不推荐)r.GET("/map", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "Hello World",})})/*2.返回结构体【推荐】(类似java中的对象,但是首字母必须大写,否则无法进行序列化和反序列化)以及灵活使用tag来对结构体进行定制化操作*/type Person struct {//后面写`json:"name"`表示如果以json返回,则变量名使用nameName string `json:"name"`Message string `json:"message"`Age int `json:"age"`}r.GET("/struct", func(c *gin.Context) {data := Person{"Meta39", "Java 学习 Go", 25}c.JSON(http.StatusOK, data)})//3.请求地址携带参数的请求【不推荐】(主要使用c.Query,访问:localhost:8080/query?name=Meta39&age=25,浏览器返回Meta39,控制台输出age: 25)r.GET("/query", func(c *gin.Context) {name := c.Query("name")age := c.Query("age")c.JSON(http.StatusOK, gin.H{"name": name,})fmt.Printf("age: %s\n", age)})//4.获取URL路径参数【推荐】(根据用户ID查询用户信息,访问:localhost:8080/user/1)//relativePath也可以是/user/:id/:age,多个组合r.GET("/user/:id", func(c *gin.Context) {id := c.Param("id")c.JSON(http.StatusOK, gin.H{"id": id,"name": "Meta39","age": 25,"sex": "Man",})})//5.参数绑定ShouldBind【推荐】(访问:localhost:8080/shouldBind,在body {"username": "mata","password": "123456"})r.POST("/shouldBind", func(c *gin.Context) {//声明UserInfo类型的变量uvar u UserInfo//& 类似于 Spring @RequestBody 注解err := c.ShouldBind(&u)if err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error(),})return}fmt.Printf("%+v\n", u)c.JSON(http.StatusOK, gin.H{"success": "ok",})})//6.文件上传r.POST("/upload", func(c *gin.Context) {//从请求中读取文件f, err := c.FormFile("file")if err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error(),})return}//将读取的文件保存到本地dst := path.Join("./", f.Filename)_ = c.SaveUploadedFile(f, dst)c.JSON(http.StatusOK, gin.H{"success": "ok",})})//7.处理404r.NoRoute(func(c *gin.Context) {c.JSON(http.StatusNotFound, gin.H{"code": 404,"message": "404 Not Found","data": nil,})})//8.路由组【支持嵌套】(类似SpringBoot里的@RequestMapping)userGroup := r.Group("/users"){//根据用户id查询用户userGroup.GET("/:id", func(c *gin.Context) {id := c.Param("id")c.JSON(http.StatusOK, gin.H{"id": id,"name": "Meta39",})})//创建用户userGroup.POST("/", func(c *gin.Context) {var u UserInfoerr := c.ShouldBind(&u)if err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error(),})}fmt.Printf("创建用户:%+v\n", u)c.JSON(http.StatusOK, gin.H{"success": "ok",})})}//9.定义中间件,一般放到路由组Group(类似Java中的filter过滤器)r.GET("/handlerFunc", MyHandlerFunc(true), func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "MyHandlerFunc",})})//10.在控制台输入 go get -u gorm.io/gorm 安装 gorm 软件包//11.在控制台输入 go get -u gorm.io/driver/mysql 安装 gorm mysql 数据库驱动软件包dsn := "root:123456@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local"db, gormErr := gorm.Open(mysql.Open(dsn), &gorm.Config{})if gormErr != nil {panic("failed to connect database")}// 迁移 schema_ = db.AutoMigrate(&UserInfo{})var userInfo UserInfo// Createdb.Create(&UserInfo{Username: "Meta39", Password: "123456"})// Readdb.First(&userInfo, 1) // 根据整型主键查找db.First(&userInfo, "username = ?", "Meta39") // 查找 username 字段值为 Meta39 的记录// Update - 将 userInfo 的 Password 更新为 654321db.Model(&userInfo).Update("Password", "654321")// Update - 更新多个字段db.Model(&userInfo).Updates(UserInfo{Username: "Meta", Password: "123"}) // 仅更新非零值字段db.Model(&userInfo).Updates(map[string]interface{}{"Username": "Meta1", "Password": "234"})// Delete - 删除 userInfo(默认:软删除,即:打上删除标志,如在deleted_at填充时间,表示这条数据已经被删除了)//db.Delete(&userInfo, 1)//永久删除//db.Unscoped().Delete(&userInfo, 1)//启动服务不指定端口号,则默认:8080ginErr := r.Run(":8080")//启动异常处理并输出异常信息if ginErr != nil {fmt.Printf("ginErr:%v\n", ginErr)return}}
控制台执行
go run .\main.go
打开浏览器访问localhost:8080/map会输出JSON格式的Hello World
数据库会有一条id = 1的记录
相关文章:
Go之Web急速入门Gin+Gorm框架
简介 只作为快速入门、了解Go的GinGorm框架的demo,不能作为企业级开发。 详细用法请看官网 《Gin官网》 《Gorm官网》 使用GoLand创建Go项目(默认modules) go版本1.22.2 需要设置代理下载go相关软件包,否则软件包可能无法下载。…...
【MySQL进阶之路 | 高级篇】ER模型
1. 概述 数据库设计是牵一发而动全身的。那么有没有什么办法可以提前看到数据库的全貌呢?比如需要哪些数据表,数据表中应该有哪些字段,通过什么字段进行连接等等。这样我们才能进行整体的梳理和设计。 其实,ER模型就是一个这样的…...
C++基础语法:STL之容器(4)--序列容器中的list(一)
前言 "打牢基础,万事不愁" .C的基础语法的学习 引入 序列容器的学习.以<C Prime Plus> 6th Edition(以下称"本书")内容理解 本书中容器内容不多只有几页.最好是有数据结构方面的知识积累,如果没有在学的同时补上. 序列容器回顾:序列容器内元素按严格…...
WordPress杂技
WordPress杂技 WordPress页面构建器: Avada、Elementor、astra、 Elementor作为一款强大的页面构建工具。 Avada:是一款非常受欢迎的WordPress主题,它的设计理念是简洁、现代、响应式,Avada拥有丰富的模板和布局,可以轻松创建出…...
鸿蒙 动态共享包HSP的创建和引用
1.什么是动态共享包HSP HSP(Harmony Shared Package)是动态共享包,可以包含代码、C库、资源和配置文件,通过HSP可以实现代码和资源的共享。HSP不支持独立发布,而是跟随其宿主应用的APP包一起发布,与宿主应…...
ARM架构(二)—— arm v7-a/v8/v9寄存器介绍
1、ARM v7-A寄存器 1.1 通用寄存器 V7 V8开始 FIQ个IRQ优先级一样, 通用寄存器:31个 1.2 程序状态寄存器 CPSR是程序状态毒存器,保存条件标志位,中断禁止位,当前处理器模式等控制和状态位。每种异常模式下还存在SPS…...
C++合作开发项目:美术馆1.0
快乐星空MakerZINCFFO 合作入口:CM工作室 效果图: 代码: (还有几个音乐!) main.cpp #include <bits/stdc.h> #include <windows.h> #include <conio.h> #include <time.h> #in…...
QT 5 同时使用Q_DECLARE_METATYPE(pointdata) 和继承 QObjectUserData
在Qt框架中,QObjectUserData 和 Q_DECLARE_METATYPE() 宏都与Qt的元对象系统有关,但它们的使用方式有一些特别的限制和兼容性问题。 关于QObjectUserData: QObjectUserData 是一个用来存储用户数据的类。在Qt中,每个 QObject 可以…...
【MySQL进阶之路 | 高级篇】范式概述与第一范式
1. 范式简介 在关系型数据库中,关于数据表的设计的基本原则,规则就称为范式。可以理解为,一张数据表的设计结果需要满足的某种设计标准的级别。要想设计一个结构合理的关系型数据库,必须满足一定的范式。 范式的英文名是Normal …...
Open-TeleVision复现及机器人迁移
相关信息 标题 Open-TeleVision: Teleoperation with Immersive Active Visual Feedback作者 Xuxin Cheng1 Jialong Li1 Shiqi Yang1 Ge Yang2 Xiaolong Wang1 UC San Diego1 MIT2主页 https://robot-tv.github.io/链接 https://robot-tv.github.io/resources/television.pdf代…...
Notepad++换安装路径之后,右键打开方式报错:Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。的处理方法
把Notepad添加到右键打开方式,可以参考下面的3篇文章添加: https://blog.csdn.net/xiaoerbuyu1233/article/details/88287747 https://blog.csdn.net/qq_44000337/article/details/120277317 https://www.cnblogs.com/zhrngM/p/12899026.html 这里主要是…...
【Flutter 面试题】 使用成熟状态管理库的弊端有哪些?
【Flutter 面试题】 使用成熟状态管理库的弊端有哪些? 文章目录 写在前面口述回答补充说明写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主,51CTO专家博主。2023博客之星TOP153。 👏🏻 正在学 Flutter 的同学,你好! 😊 …...
Apache Commons技术详解
文章目录 简介官网链接原理基础使用Commons LangCommons Collections 高级使用Commons IOCommons Math 优缺点优点缺点 总结 简介 Apache Commons 是 Apache 软件基金会下的一个项目,旨在提供可重用的Java组件。这些组件覆盖了广泛的编程任务,从字符串处…...
怎样使用 Juicer tools 的 dump 命令将.hic文件转换为交互矩阵matrix计数文件 (Windows)
创作日志: 万恶的生信…一个scHiC数据集没有提供处理好的计数文件,需要从.hic转换。Github一个个好长的文档看了好久才定位到 juicer tools 的dump命令,使用起来比想象中简单。 一、下载Juicer tools 注意:使用Juicer tools的前提…...
【Docker】Docker Desktop - WSL update failed
问题描述 Windows上安装完成docker desktop之后,第一次启动失败,提示:WSL update failed 解决方案 打开Windows PowerShell 手动执行: wsl --set-default-version 2 wsl --update...
基于rsync\unlink 等一套本机备份跨机备份历史备份清理shell 脚本
一 摘要 本文主要介绍一套本地备份、跨机器备份、历史备份清理脚本,使用场景如数据库备份等 二 环境 linux 系列系统 基本都支持,个别命令可能需要微调。 2.1 实验环境 [rootlocalhost rsync]# cat /etc/centos-release CentOS Linux release 7.9.2…...
使用nginx实现一个端口和ip访问多个vue前端
前言:由于安全组要求,前端页面只开放一个端口,但是项目有多个前端,此前一直使用的是一个前端使用单独一个端口进行访问,现在需要调整。 需要实现:这里以80端口为例,两个前端分别是:p…...
Linux云计算 |【第一阶段】SERVICES-DAY5
主要内容: 源码编译安装、rsync同步操作、inotify实时同步、数据库服务基础 实操前骤:(所需tools.tar.gz与users.sql) 1.两台主机设置SELinnx和关闭防火墙 setenforce 0 systemctl stop firewalld.service //停止防火墙 sy…...
IP第一次综合实验
一、实验拓扑 二、实验要求 1、R6为ISP,接口IP地址均为公有地址,该设备只能配置地址之后不能冉对其进行任何配置 2、R1-R5为局域网,私有Ip地址192.168.1.0/24,请合理分配 3、R1、82、R4,各有两个环回IP地址;R5,R6各…...
Could not load dynamic library ‘cudart64_100.dll‘
python代码报错 Could not load dynamic library cudart64_100.dll; dlerror: cudart64_100.dll not found 2024-07-22 14:19:21.931639: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine…...
四大引用——强软弱虚
目录 一、强引用 二、软引用 三、弱引用 四、虚引用 一、强引用 强引用是在程序代码之中普遍存在的,类似于“Object obj new Object()”,obj变量引用Object这个对象,就叫做强引用。当内存空间不足,Java虚拟机宁愿抛出OutOfMe…...
MySQL--索引(2)
InnoDB 1.索引类型 主键索引(Primary Key) 数据表的主键列使用的就是主键索引。 一张数据表有只能有一个主键,并且主键不能为 null,不能重复。 在 mysql 的 InnoDB 的表中,当没有显示的指定表的主键时,InnoDB 会自动先检查表中是…...
JVM类加载机制详解
Java在运行期才对类进行加载到内存、连接、初始化过程。这使得Java应用具有极高的灵活性和拓展性,可以依赖运行期进行动态加载和动态连接。 主要加载哪些?Java中的数据类型分为基本数据类型和引用数据类型,基本数据类型由虚拟机预先定义&…...
【MATLAB实战】基于UNet的肺结节的检测
数据: 训练过程图 算法简介: UNet网络是分割任务中的一个经典模型,因其整体形状与"U"相似而得名,"U"形结构有助于捕获多尺度信息,并促进了特征的精确重建,该网络整体由编码器,解码器以及跳跃连接三部分组成。 编码器由…...
Elasticsearch基础(五):使用Kibana Discover探索数据
文章目录 使用Kibana Discover探索数据 一、添加样例数据 二、数据筛选 三、保存搜索 使用Kibana Discover探索数据 一、添加样例数据 登录Kibana。在Kibana主页的通过添加集成开始使用区域,单击试用样例数据。 在更多添加数据的方式页面下方,单击…...
爬取百度图片,想爬谁就爬谁
前言 既然是做爬虫,那么肯定就会有一些小心思,比如去获取一些自己喜欢的资料等。 去百度图片去抓取图片吧 打开百度图片网站,点击搜索xxx,打开后,滚动滚动条,发现滚动条越来越小,说明图片加载…...
HTTP 缓存
缓存 web缓存是可以自动保存常见的文档副本的HTTP设备,当web请求抵达缓存时,如果本地有已经缓存的副本,就可以从本地存储设备而不是从原始服务器中提取这个文档。使用缓存有如下的优先。 缓存减少了冗余的数据传输缓存环节了网络瓶颈的问题…...
设计模式实战:图形编辑器的设计与实现
简介 本篇文章将介绍如何设计一个图形编辑器系统,系统包括图形对象的创建、组合、操作及撤销等功能。我们将通过这一项目,应用命令模式、组合模式和备忘录模式来解决具体的设计问题。 问题描述 设计一个图形编辑器系统,用户可以创建并操作图形对象,将多个图形对象组合成…...
.NET 情报 | 分析某云系统添加管理员漏洞
01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失…...
vue检测页面手指滑动距离,执行回调函数,使用混入的语法,多个组件都可以使用
mixin.ts 定义滑动距离的变量和检测触摸开始的方法,滑动方法,并导出两个方法 sendTranslateX.value > 250 && sendTranslateY.value < -100是向上滑动,满足距离后执行回调函数func,并在一秒内不再触发,一…...
做招聘网站怎么办营业执照/友情网
超像素 (Super-Pixel) 是一种图像处理方法,旨在将图像分割成较小的、均匀的像素块,以便于进行进一步的分析和处理。 在 Python 中,你可以使用 scikit-image 库中的 segmentation 模块来实现超像素。你可以使用其中的 slic() 函数来将图像分割…...
企业建设网站的步骤是什么意思/大数据分析营销平台
本文介绍了详解HTML5将footer置于页面最底部的方法(CSSJS),分享给大家,具体如下:JavaScript:$(function(){function footerPosition(){$("footer").removeClass("fixed-bottom");//网页正文全文高度var contentHeight d…...
绍兴网站建设设计/做一个网站要多少钱
1:我们打开vs开发工具新建项目添加asp.net web 服务应用程序 2 添加web应用程序服务好后可以先测试service.asmx文档 3 我在后service.asmx后台添加四个功能函数(求和、差、乘、除) using System; using System.Collections.Generic; using S…...
东莞网站建设网络公司公司/windows优化软件哪个好
分析:是不是觉得这个问题很基础,其实我也这么觉得。然而根据面试经验发现,至少百分八十的人答不上这个问题。建议,在项目中用到后,再类比记忆,体会更深,不要硬记。基本上,一个合格的…...
企业如何在网站做认证/今天热点新闻事件
使用pycharm时常出现 the IDE is running low on memory 的问题,表示pycharm这款IDE使用内存不足,需要在系统内存充足的情况下扩充IDE memory。(推荐:pycharm教程)首先,打开File —> Appearance —>Windows Options —>…...
html5手机网站发布/网络营销招聘岗位有哪些
SVN分支与合并 一、 分支与合并的概念 二、 SVN分支的意义 三、 如何创建分支与合并分支 一、分支与合并的概念: 分支:版本控制系统的一个特性是能够把各种修改分离出来放在开发品的一个分割线上。这条线被称为分支。分支经常被用来试验新的特性…...