Go语言学习的第三天--下部分(Gin框架的基础了解)
每天都会分享Go的知识,喜欢的朋友关注一下。每天的学习分成两部分基础(必要的,基础不牢地动山摇),另一部分是Go的一些框架知识(会不定时发布,因为小Wei也是一名搬砖人)。但是可以保证基础部分会每天更新,加强对基础部分的了解,与深入会对这门语言有不一样的了解,至于框架或者其他类型的知识 时间充裕的情况下,会发表一些自己的观点与心得 希望大家多多点评。
不多闲聊了,今天给大家带来的是Gin,初步带大家了解一些Gin的安装、路由、如何访问静态资源等等
一、Gin的安装
根据文档进行安装https://learnku.com/docs/gin-gonic/1.7/quickstart/11354
go get -u github.com/gin-gonic/gin //go get 的 作用与 git 一样使用上面的命令后会出现一些报错 遇到 go get 报错不要慌

解决办法:
1:开启go modules功能,命令行输入
go env -w GO111MODULE=on2:在该项目目录下,初始化Go moudle,运行下面命令
go mod init xxx //xxx代表文件夹名重新go get 就好了,在test 文件下会出现go.mod和go.sum两个文件,以及外部库 会有test结尾的Modules包

如果没有 请配置一下 idea编辑器 Goland为例
第一 Go模块中的环境 与 go env 中的一致


第二Gopath中

第三 Goroot

和大家在这里说一下Gin这个框架就是一个包儿(熟悉其它语言的同学,看到这个可能不习惯)其他的都需要手动创建 这个main.go就是手动创建的,今天只是初步进行了解 ,就不过多去讲解什么了,到这里的话框架就算搭建完了 ,感兴趣的同学可以输出一下Hello word

二、Restful Api
从其它语言转go的同学应该不陌生这个,刚开始接触的同学也不要慌张,所以就长或短说做个对比
/**其他语言风格get /userpost /create_userpost /update_userpost /delete_userGin restfulapiget /userpost /userput /userdelete /user*///访问地址,处理请求ginServer.GET("/hello", func(context *gin.Context) {context.JSON(200, gin.H{"msg": "hello,word"})})ginServer.POST("/user", func(context *gin.Context) {context.JSON(200, gin.H{"msg": "post,user"})})ginServer.PUT("userPut", func(context *gin.Context) {context.JSON(200, gin.H{"msg": "put,user"})})ginServer.DELETE("userDelete", func(context *gin.Context) {context.JSON(200, gin.H{"msg": "delete,user"})})举个例子 简单说下格式
package mainimport ("github.com/gin-gonic/gin"
)
/**简单使用流程 1、引入包2、创建服务3、定义端口4、路由请求
*/
func main() {ginServer := gin.Default() //创建一个服务//restful apiginServer.GET("/user", func(context *gin.Context) {//json格式 context.JSON(200, gin.H{"msg": "这是一个Get请求"})})//创建端口/**ginServer.Run("8081") 这是一个错误的写法运行后会报错:listen tcp: address 8081: missing port in address*/ginServer.Run(":8081")
}
三、如何响应页面给前端web
/**响应页面给前端web加载静态页面*/ginServer.LoadHTMLGlob("templates/*") //全局加载//ginServer.LoadHTMLFiles("templates/index.html") 加载指定文件//加载资源文件ginServer.Static("/static", "./static")ginServer.GET("/index", func(context *gin.Context) {//context.JSON() 返回jsoncontext.HTML(http.StatusOK, "index.html", gin.H{"msg": "这是后台数据",}) //返回页面})
四、如何获取请求参数
//获取请求参数//传统 url?userid=xxx&username=xxxginServer.GET("/user/info", myHandler(), func(context *gin.Context) {//取出中间件值userSession := context.MustGet("userSession").(string)//打印log.Println("userSession=======>", userSession)userid := context.Query("userid")username := context.Query("username")context.JSON(http.StatusOK, gin.H{"userid": userid,"username": username,})})// restful url/user/info/xx/xxginServer.GET("/user/infors/:userid/:username", func(context *gin.Context) {userid := context.Param("userid")username := context.Param("username")context.JSON(http.StatusOK, gin.H{"userid": userid,"username": username,})})五、如何处理序列化
//序列化 前端给后端传jsonginServer.POST("/json", func(context *gin.Context) {//request.bodyb, _ := context.GetRawData()var m map[string]interface{}//包装为json数据 []byte_ = json.Unmarshal(b, &m)context.JSON(http.StatusOK, m)})六、如何接收表单值
//表单ginServer.POST("/user/add", func(context *gin.Context) {username := context.PostForm("username")password := context.PostForm("password")context.JSON(http.StatusOK, gin.H{"msg": "ok","username": username,"password": password,})})三、四、六的前端页面

七、路由重定向、404和路由组
//路由ginServer.GET("/tests", func(context *gin.Context) {//重定向context.Redirect(http.StatusMovedPermanently, "/index")})//404 notRouteginServer.NoRoute(func(context *gin.Context) {//404context.HTML(http.StatusOK, "index.html", nil)})//路由组userGroup := ginServer.Group("/user"){userGroup.GET("/add")userGroup.POST("/login")userGroup.DELETE("delete")}八、中间件的使用(拦截器)
自行打印 仅提供思路
package mainimport ("github.com/gin-gonic/gin""log"
)
// 自定义中间件 预处理
func myHandler() gin.HandlerFunc {return func(context *gin.Context) {context.Set("userSession", "userid")//if(value){ 中间件判断////}context.Next() //通过放行context.Abort() //拦截}
}
func main() {ginServer := gin.Default() //创建一个服务//restful apiginServer.GET("/user", myHandler() ,func(context *gin.Context) {//取出中间件值userSession := context.MustGet("userSession").(string)//打印log.Println("userSession=======>", userSession)//json 格式context.JSON(200, gin.H{"msg": "这是一个Get请求"})})//创建端口就ginServer.Run(":8083")
}九、简单观察Go的多线程
观察一下Go的速度
package mainimport ("fmt""time"
)func main() {//go的多线程-协程go printGo()for i := 0; i < 1000; i++ {fmt.Println("main=>", i)}time.Sleep(time.Second * 3) //主线程快结束时休息三秒
}func printGo() {for i := 0; i < 1000; i++ {fmt.Println("printGo====>", i)}
}
Gin的初步了解,有其他语言基础的同学,了解玩这些就可以做一些简单的web小网站了 后续还会有其他知识的补充
相关文章:
Go语言学习的第三天--下部分(Gin框架的基础了解)
每天都会分享Go的知识,喜欢的朋友关注一下。每天的学习分成两部分基础(必要的,基础不牢地动山摇),另一部分是Go的一些框架知识(会不定时发布,因为小Wei也是一名搬砖人)。但是可以保证…...
JDK的动态代理(powernode 文档)(内含源代码)
JDK的动态代理(powernode 文档)(内含源代码) 源代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87546086 一、动态代理 目录JDK的动态代理(powernode 文档)࿰…...
第1章 多线程基础
第1章 多线程基础 1.1.2 线程与进程的关系 进程可以看成是线程的容器,而线程又可以看成是进程中的执行路径。 1.2 多线程启动 线程有两种启动方式:实现Runnable接口;继承Thread类并重写run()方法。 执行进程中的任务时才会产生线程&a…...
Linux基本指令(一)
文章目录文件操作文档操作系统管理网络通信备份压缩Ctrl Alt T 打开终端 文件操作 1.复制文件 cp afile bfile (将名为afile的文件复制到名为bfile的文件夹中,如果bfile文件不存在,系统将会创建此文件,如果bfile文件已经存在&a…...
el-dialog子组件在mounted周期内获取不到dom?
el-dialog子组件在mounted周期内获取不到dom?一、问题描述二、分析原因三、猜测正常父子组件在mounted生命周期内可以获得dom 父created—子created—子mounted—父mounted----子updated—父updated 一、问题描述 ** el-dialog控制显示隐藏是css控制的display&…...
第九章 opengl之光照(光照贴图)
OpenGL光照贴图漫反射贴图镜面光贴图光照贴图 一个物体的不同部分是不同的材质,那么会有不同的环境光和漫反射颜色表现。 漫反射贴图 原理就是:纹理。 是对同样的原理使用了不同的名字:其实都是使用一张覆盖物体的图像,让我们能…...
JDK动态代理(powernode CD2207 video)(内含教学视频+源代码)
JDK动态代理(powernode CD2207 video)(内含教学视频源代码) 教学视频原代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87545977 目录JDK动态代理(powernode CD2207 video…...
【Linux】Sudo的隐晦bug引发的一次业务问题排查
Sudo的隐晦bug引发的一次业务问题排查写在前面问题描述问题排查高负载现象排查日志排查跟踪任务调度过程Sudo引发的问题手动复现问题分析处理方案写在前面 记录一次生产环境sudo启动进程频繁被Kill且不报错的异常处理过程,如果遇到同样的问题只想要解决方案&#x…...
Java VisualVM 安装 Visual GC 插件图文教程
文章目录1. 通过运行打开 Java VisualVM 监控工具2. 菜单栏初始视图说明3. 工具插件菜单说明4. 手工安装插件5. 重启监控工具查看 Visual GC1. 通过运行打开 Java VisualVM 监控工具 首先确保已安装 Java 环境,如此处安装版本 JDK 1.8.0_161 C:\Users\niaonao>j…...
【C语言】详解静态变量static
关键字static 在C语言中:static是用来修饰变量和函数的static主要作用为:1. 修饰局部变量-静态局部变量 2. 修饰全局变量-静态全局变量3. 修饰函数-静态函数在讲解静态变量之前,我们应该了解静态变量和其他变量的区别: 修饰局部变量 //代码1 #include &l…...
SpringBoot整合ElasticSearch实现模糊查询,排序,分页,高亮
目录 前言 1.框架集成-SpringData-整体介绍 1.1Spring Data Elasticsearch 介绍 2.框架集成Spring Data Elasticsearch 2.1版本说明 2.2.idea创建一个springboot项目 2.3.导入依懒 2.3.增加配置文件 2.4Spring Boot 主程序。 2.5.数据实体类 2.6.配置类 2.7.DAO 数据…...
YARN基本架构
主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成,如图所YA示。 ResourceManager(RM) RM是全局资源管理器,负责整个系统的资源管理和分配 主要由两个组件构成:Scheduler调度器和应用程序…...
【C++复习】类和对象全知识点总结
类和对象写在前面类和对象面向对象类类的定义类的访问限定符类的作用域类的实例化类对象大小this指针类的默认成员函数构造函数析构函数拷贝构造函数运算符重载赋值运算符重载前置后置重载取地址及const取地址操作符重载const 成员static 成员友元友元函数有元类内部类匿名对象…...
基于轻量级YOLOv5开发构建汉字检测识别分析系统
汉字检测、字母检测、手写数字检测、藏文检测、甲骨文检测在我之前的文章中都有做过了,今天主要是因为实际项目的需要,之前的汉字检测模型较为古老了还使用的yolov3时期的模型,检测精度和推理速度都有不小的滞后了,这里要基于yolo…...
leetcode-每日一题-66(简单题,数组)
这道题其实还没那么简单,中间还是有的绕的。。。。给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会…...
LeetCode295之数据流的中位数(相关话题:优先队列)
题目描述 中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: MedianFinder() 初始化 Media…...
助你加速开发效率!告别IDEA卡顿困扰的性能优化技巧
在现代软件开发中,IDE(集成开发环境)是一个必不可少的工具。IntelliJ IDEA是一个广受欢迎的IDE,但有时候IDE的性能可能会受到影响,导致开发人员的工作效率降低。本文将介绍一些可以提高IDE性能的技巧,帮助开…...
Java设计模式-适配器模式
1、简介 适配器模式是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。 2、适配器模式分类 目标接口(Target&#x…...
Linux 练习六 (IPC 管道)
文章目录1 标准管道流2 无名管道(PIPE)3 命名管道(FIFO)3.1 创建删除管道文件3.2 打开和关闭FIFO文件3.3 管道案例:基于管道的客服端服务器程序使用环境:Ubuntu18.04 使用工具:VMWare workstati…...
合并两个有序链表(精美图示详解哦)
全文目录引言合并两个有序链表题目描述方法一:将第二个链表合并到第一个思路实现方法二:尾插到哨兵位的头节点思路实现总结引言 在前面两篇文章中,我们介绍了几道链表的习题:反转链表、链表的中间结点、链表的倒数第k个结点&…...
SDMatte高可用集群部署:基于Kubernetes的弹性伸缩方案
SDMatte高可用集群部署:基于Kubernetes的弹性伸缩方案 1. 为什么需要高可用部署方案 电商大促期间,某美妆品牌突然发现他们的AI抠图服务崩溃了——每秒上千张的商品图等待处理,但单机部署的服务早已不堪重负。这种场景在企业级AI应用部署中…...
Sonic数字人效果展示:看静态图片如何“开口说话”生成流畅视频
Sonic数字人效果展示:看静态图片如何"开口说话"生成流畅视频 1. 数字人视频生成技术概览 数字人视频技术正在改变内容创作的方式。传统方法需要复杂的3D建模和动画制作,而现在的AI技术只需一张静态图片和一段音频,就能让图片中的…...
告别网络依赖:用这个开源工具+高德离线包,5步搞定前端地图离线展示
前端开发者的离线地图解决方案:5步实现高德地图本地化部署 在紧急演示、内网开发或网络不稳定的环境中,依赖在线地图服务往往成为前端开发的痛点。我曾参与过一个政府内网项目,现场演示时因网络权限问题导致地图无法加载,最后不得…...
Unsloth Docker部署详解:从零开始搭建训练环境
Unsloth Docker部署详解:从零开始搭建训练环境 1. 环境准备与Docker安装 1.1 系统要求检查 在开始之前,请确保你的系统满足以下基本要求: 64位Linux系统(推荐Ubuntu 22.04)NVIDIA显卡驱动已安装(建议版…...
Super Qwen Voice World效果惊艳:‘金币数量’HUD实时反映生成计数
Super Qwen Voice World效果惊艳:‘金币数量’HUD实时反映生成计数 "Its-a me, Qwen!" 欢迎来到基于 Qwen3-TTS 构建的复古像素风语气设计中心。在这里,配音不再是枯燥的参数调节,而是一场 8-bit 的声音冒险! 1. 视觉盛…...
I-Lang SEO实战部署:用结构化协议让Google的AI爬虫读懂你的网页
前言: 我们用I-Lang的结构化方法论做SEO,一个全新的英文商业站,七天打进Google搜索第一页。这篇文章把具体方法公开。 一、前提:Google的爬虫已经是AI了 2024年之后,Google的搜索排名算法发生了根本性变化。Googlebot…...
效率革命:设计师必备的Sketch批量命名神器RenameIt完全指南
效率革命:设计师必备的Sketch批量命名神器RenameIt完全指南 【免费下载链接】RenameIt Keep your Sketch files organized, batch rename layers and artboards. 项目地址: https://gitcode.com/gh_mirrors/re/RenameIt 在现代UI/UX设计流程中,保…...
MySQL技巧(八) :死锁解决与实战案例
在数据库高并发场景下,死锁是一个绕不开的经典难题。两个或多个事务相互持有对方需要的锁,导致都无法继续执行,就像两辆车在狭窄路口互不相让。本文将带你从原理到实战,掌握死锁的排查、解决和预防全流程。一、死锁快速定位当应用…...
蓝桥杯 电池分组
...
OpenClaw快速安装部署:让AI住进你的电脑
一、前言 上篇说完OpenClaw是什么,有小伙伴留言说:“听起来挺猛,但安装肯定很复杂吧?”确实,之前我也有这个顾虑。毕竟涉及到Gateway、Agent、多渠道配置,听起来就头大。 但实际搞下来——就两条命令。 今天…...
