每天都会分享Go的知识,喜欢的朋友关注一下。每天的学习分成两部分基础(必要的,基础不牢地动山摇),另一部分是Go的一些框架知识(会不定时发布,因为小Wei也是一名搬砖人)。但是可以保证基础部分会每天更新,加强对基础部分的了解,与深入会对这门语言有不一样的了解,至于框架或者其他类型的知识 时间充裕的情况下,会发表一些自己的观点与心得 希望大家多多点评。
不多闲聊了,今天给大家带来的是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
从其它语言转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
加载静态页面
*/
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,
})
})
//路由
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的速度
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小网站了 后续还会有其他知识的补充