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 报错不要慌

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

解决办法:

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包

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

如果没有 请配置一下 idea编辑器 Goland为例

第一 Go模块中的环境 与 go env 中的一致

Go语言学习的第三天--下部分(Gin框架的基础了解)_第3张图片
Go语言学习的第三天--下部分(Gin框架的基础了解)_第4张图片

第二Gopath中

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

第三 Goroot

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

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

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

二、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")  
}
Go语言学习的第三天--下部分(Gin框架的基础了解)_第8张图片

三、如何响应页面给前端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": "这是后台数据",
        }) //返回页面
    })
Go语言学习的第三天--下部分(Gin框架的基础了解)_第9张图片

四、如何获取请求参数

//获取请求参数
    //传统  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,
        })
    })

三、四、六的前端页面

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

七、路由重定向、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)
    }
}
Go语言学习的第三天--下部分(Gin框架的基础了解)_第11张图片

Gin的初步了解,有其他语言基础的同学,了解玩这些就可以做一些简单的web小网站了 后续还会有其他知识的补充

你可能感兴趣的:(Golang,golang)