Go语言学习的第三天--下部分(Gin框架的基础了解)

news2025/7/18 17:22:49

每天都会分享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=on

2:在该项目目录下,初始化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  /user
      post /create_user
      post /update_user
      post /delete_user

      Gin restfulapi
      get /user
      post /user
      put  /user
      delete /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 main

import (
    "github.com/gin-gonic/gin"
)
/**
  简单使用流程 
   1、引入包
   2、创建服务
   3、定义端口
   4、路由请求
*/
func main() {
    ginServer := gin.Default() //创建一个服务
    //restful api
    ginServer.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()  返回json
        context.HTML(http.StatusOK, "index.html", gin.H{
            "msg": "这是后台数据",
        }) //返回页面
    })

四、如何获取请求参数

//获取请求参数
    //传统  url?userid=xxx&username=xxx
    ginServer.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/xx
    ginServer.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,
        })
    })

五、如何处理序列化

//序列化 前端给后端传json
    ginServer.POST("/json", func(context *gin.Context) {
        //request.body
        b, _ := 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 notRoute
    ginServer.NoRoute(func(context *gin.Context) {
        //404
        context.HTML(http.StatusOK, "index.html", nil)
    })
    //路由组
    userGroup := ginServer.Group("/user")
    {
        userGroup.GET("/add")
        userGroup.POST("/login")
        userGroup.DELETE("delete")
    }

八、中间件的使用(拦截器)

自行打印 仅提供思路

package main

import (
    "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 api
    ginServer.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 main

import (
    "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小网站了 后续还会有其他知识的补充

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

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

相关文章

哪个牌子的蓝牙耳机最好?质量最好的蓝牙耳机排行榜

随着蓝牙耳机的发展越来越快速&#xff0c;蓝牙耳机市场涌现出五花八门的产品&#xff0c;外观不同、性能不一。最近看到很多人问&#xff0c;哪个牌子的蓝牙耳机最好&#xff1f;接下来&#xff0c;我来给大家推荐几款质量最好的蓝牙耳机排行榜&#xff0c;一起来看看吧。 一…

电商使用CRM系统有什么好处,如何选择

数据显示&#xff0c;使用电商CRM客户管理系统后&#xff0c;企业销售额提高了87%&#xff0c;客户满意度提高了74%&#xff0c;业务效率提高了73%。要在竞争激烈的电商市场取得成功&#xff0c;与目标受众的有效沟通是有效的方法。下面说说什么是电商CRM系统&#xff1f;电商C…

如何使用ArcGIS生成剖面图(附练习数据)

1、概述地形剖面图指沿地表某一直线方向上的垂直剖面图&#xff0c;以显示剖面线上断面地势起伏状况。能够制作剖面图的软件有很多&#xff0c;作为GIS行业的老大&#xff0c;ArcGIS当然也是可以的&#xff0c;这里给大家详细介绍一下ArcGIS中制作剖面图的知识&#xff0c;希望…

2.详解DEBUG模式

文章目录DEBUG模式解决了两个问题四种开启DEBUG的方式第一种第二种第三种第四种DEBUG的PIN码可以在浏览器端调试代码使用&#xff08;不推荐使用&#xff0c;了解就可以&#xff09;DEBUG模式解决了两个问题 flask代码中如果出现了异常&#xff0c;我们在浏览器中不会提示具体…

图床搭建,使用typora上传

1. 准备gitee作为图床的仓库 新建仓库 准备仓库的私人令牌&#xff0c;后面配合使用 点击个人设置——》私人令牌 注意私人令牌&#xff0c;复制保存好&#xff0c;后面不能再看了 2. 准备PicGO&#xff0c;并进行相关配置 PicGo官方下载链接 下载安装好node.js,下载网址 安…

【银行测试】必看的四类题型:这可是最经典的一套题目了

目录&#xff1a;导读 一、根据题目要求写出具体LINUX操作命令 二、JMETER题目 三、根据题目要求写出具体SQL语句 四、测试案例设计题 金三银四面试面对大厂面试官提问&#xff0c;如何回答&#xff1a;花3天背完这100道软件测试面试题&#xff01;银行测试的offer还不是手…

【GO】K8s 管理系统项目34[Linux环境–应用部署]

K8s 管理系统项目[Linux环境–应用部署] 1. 启动数据库 1.1 配置yum仓库 rm -f /etc/yum.repos.d/*.repo wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/…

Vue 实现图片监听鼠标滑轮滚动实现图片缩小放大功能

前言 其实想要实现功能很简单&#xff0c;就是在一张图片上监听鼠标滑轮滚动的事件&#xff0c;然后根据上滚还是下滚实现图片的缩放。 效果&#xff1a; 注&#xff1a;该配图使用《漫画|有趣的了解一下赋值、深浅拷贝》文章图片&#xff0c;不存在侵权问题。 实现思路 在…

规划数据指标体系方法(下)——新海盗模型

前面已经跟大家分享了规划数据指标体系的两种方法—— OSM 和 UJM 模型&#xff0c;分别从目标-策略以及用户旅途的角度阐述了规划数据指标体系的过程。今天我来跟大家分享最后一种规划数据指标体系的方法——新海盗模型。 了解新海盗模型 海盗模型&#xff0c;即 AARRR 模型&…

脑机接口科普0014——大脑

本文禁止转载&#xff01;&#xff01;&#xff01;&#xff01; 在提到脑机接口的时候&#xff0c;不得不提到大脑。 在我们的思维意识中&#xff0c;植物是没有大脑的。这是正确的。 在我们的思维意识中&#xff0c;动物都是有大脑的。 但是很明显&#xff0c;动物都有大…

程序员看过都说好的资源网站,你值得拥有。

程序员必备的相关资源网站一.技术社区1.GitHub2.Gitee&#xff08;码云&#xff09;3.稀土掘金4.OSCHINA开源中国5.CSDN6.博客园7.SegmentFault&#xff08;思否&#xff09;8.Stack Overflow9.Golang中文社区10.ChinaUnix11.51CTO12.Ruby China二.技术教程1.Devdocs2.码农教程…

案例解读| 从集中告警平台发展趋势看城商行如何落地数字化转型(二)

上期我们以具体案例入手&#xff0c;分享了集中告警平台到底应该与集中监控平台解耦还是紧绑定等问题。这一期依旧从具体案例切入&#xff0c;跟大家一起探索下告警与服务台的对接过程&#xff0c;以及这个过程中可能产生的问题。上期内容&#xff0c;一键回顾不迷路→案例解读…

17万字 JUC 看这一篇就够了(二) (精华)

今天我们继续来学习并发编程 17万字 JUC 看这一篇就够了(一) (精华) 线程池 基本概述 线程池&#xff1a;一个容纳多个线程的容器&#xff0c;容器中的线程可以重复使用&#xff0c;省去了频繁创建和销毁线程对象的操作 线程池作用&#xff1a; 降低资源消耗&#xff0c;减…

网络工程师面试题(面试必看)(1)

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.正题 1.TCP UDP协议的区别

YARN基本架构

主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成&#xff0c;如图所YA示。 ResourceManager&#xff08;RM&#xff09; RM是全局资源管理器&#xff0c;负责整个系统的资源管理和分配 主要由两个组件构成&#xff1a;Scheduler调度器和应用程序…

ZYNQ嵌入式学习(5)

UARTUART简介发送FIFO接收FIFO模式切换寄存器操作中断和状态寄存器发送数据轮询中断接收数据轮询中断实验&#xff1a;串口中断数据环回UART简介 不需要了解时序。 UART是全双工异步收发的&#xff0c;没有时钟。 UART的操作通过配置和模式寄存器控制。 UART由独立的接受和发送…

Vue计算属性Computed

30. Vue计算属性Computed 1. 定义 Computed属性是Vue中的一个计算属性&#xff0c;是一种基于其它属性值计算而来的属性值&#xff0c;具有缓存机制&#xff0c;在依赖的属性值发生变化时会重新计算。 使用computed属性可以避免在模板中书写过多的计算逻辑&#xff0c;提高代…

【敏捷开发】jenkins「CI持续集成 CD持续部署」- 部署vue和go项目 - 待定

文章目录前言一、安装jenkins1. 部署中的痛点2. 什么是jenkins3. jenkins的安装和配置&#xff08;1&#xff09;下载&#xff08;2&#xff09;安装二、上传到运行服务器1. jenkins构建服务器流程2. 安装jenkins常用插件3. 通过freestyle构建项目4. 将构建服务器上的代码上传到…

Mybatis工程升级到FlunetMybatis后引发的问题以及解决方法

0. 背景交代为了提高开发速度,我打算将公司原有Mybatis框架升级为FlunetMybatis。可是遇到了一系列问题&#xff0c;下面开始爬坑工程结构示意如下&#xff1a;src/ ├── main │ ├── java.com.demo │ │ ├── Application.java //S…

常见数据模型

目录 1.1两类数据模型 1.2概念模型 1.3数据模型的组成要素 1.4常见数据模型 层次模型 网状模型 关系模型 数据模型是对现实世界数据特征的抽象&#xff0c;也就是说数据模型是用来描述数据、组织数据和对数据进行操作的。数据模型是数据库系统的核心和基础。 1.1两类数…