Your Name 2024-09-18 00:04:45 +08:00
commit b71bacfcfd
20 changed files with 703 additions and 0 deletions

25
api-param/main.go Normal file
View File

@ -0,0 +1,25 @@
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
//可以添加api参数
//访问的是 localhost:8000/user/{$name}
r.GET("/user/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK, name)
})
//访问的是 localhost:8000/user/{$name}/*
//返回结果{$name} is /*
r.GET("/user/:name/*ready", func(c *gin.Context) {
name := c.Param("name")
action := c.Param("ready")
c.String(http.StatusOK, name+" is "+action)
})
r.Run(":8000")
}

33
cookie/main.go Normal file
View File

@ -0,0 +1,33 @@
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
//cookie
//客户端请求服务端服务端发送cookie给客户端
func main() {
r := gin.Default()
//服务端要给客户端cookie
r.GET("cookie", func(c *gin.Context) {
//获取客户端是否携带cookie
cookie, err := c.Cookie("key_cookie")
if err != nil {
fmt.Println(err)
cookie = "NotSet"
}
c.SetCookie("key_cookie", "value_cookie", 60, "/", "localhost", false, true)
//设置cookie
//maxAge int 过期时间单位是秒
//path, cookie所在目录
//domain 域名
//secure 是否只能通过https访问
//httpOnly bool 是否允许别人通过js获取cookie
fmt.Println("cookie的值是:", cookie)
})
r.Run(":8000")
}

37
cookie/practice.go Normal file
View File

@ -0,0 +1,37 @@
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
//设置两个路由login和home
//home查看访问信息
//login会设置cookie
func checkCookie(c *gin.Context) {
cookie, err := c.Cookie("login")
if err != nil || cookie != "true" {
c.JSON(http.StatusForbidden, gin.H{"error": http.StatusText(http.StatusForbidden)})
//如果校验不通过,就结束后续的请求
c.Abort()
return
}
c.Next()
return
}
func main() {
r := gin.Default()
{
r.GET("/login", func(c *gin.Context) {
c.SetCookie("login", "true", 60, "/", "localhost", false, true)
c.String(http.StatusOK, "login success!")
})
r.GET("/home", checkCookie, func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"data": "home"})
})
}
r.Run(":8000")
}

View File

@ -0,0 +1,58 @@
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"log"
"net/http"
)
func main() {
r := gin.Default()
r.POST("/form", func(c *gin.Context) {
//表单参数设置默认值
types := c.DefaultPostForm("type", "default")
//接受其他的
username := c.PostForm("username")
password := c.PostForm("password")
//多选框
hobbys := c.PostFormArray("hobby")
c.String(http.StatusOK,
fmt.Sprintf("type is %s,username is %s,password is %s,hobby is %v", types, username, password, hobbys))
})
r.POST("/upload", func(c *gin.Context) {
//表单取文件
file, _ := c.FormFile("file")
log.Println(file.Filename)
//上传到项目的根目录,名字就用本身的
c.SaveUploadedFile(file, file.Filename)
//打印信息
c.String(200, fmt.Sprintf("uploaded file is %s", file.Filename))
})
//限制表单上传大小8MB 默认为32MB
r.POST("/uploads", func(c *gin.Context) {
r.MaxMultipartMemory = 8 << 20
//表单取文件
form, err := c.MultipartForm()
if err != nil {
c.String(http.StatusBadRequest, err.Error())
}
//获取所有图片
files := form.File["files"]
for _, file := range files {
//逐个存
err = c.SaveUploadedFile(file, file.Filename)
if err != nil {
c.String(http.StatusBadRequest, err.Error())
return
}
}
c.String(200, fmt.Sprintf("uploaded files is %s,num:%v", form.File["files"][0].Filename, len(files)))
})
r.Run(":8000")
}

View File

@ -0,0 +1,35 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="http://localhost:8000/form" method="post" enctype="application/x-www-form-urlencoded">
用户名:<input type="text" name="username">
<br>
&nbsp&nbsp码: <input type="password" name="password">
&nbsp&nbsp趣:
<input type="checkbox" value="run" name="hobby">跑步
<input type="checkbox" value="game" name="hobby">游戏
<input type="checkbox" value="money" name="hobby">金钱
<br>
<input type="submit" value="登录">
</form>
<form action="http://localhost:8000/upload" method="post" enctype="multipart/form-data">
头像: <input type="file" name="file">
<br>
<input type="submit" value="提交">
</form>
<form action="http://localhost:8000/uploads" method="post" enctype="multipart/form-data">
多个文件: <input type="file" name="files" multiple>
<br>
<input type="submit" value="提交">
</form>
</body>
</html>

33
go.mod Normal file
View File

@ -0,0 +1,33 @@
module Gin
go 1.23.0
require (
github.com/bytedance/sonic v1.12.2 // indirect
github.com/bytedance/sonic/loader v0.2.0 // indirect
github.com/cloudwego/base64x v0.1.4 // indirect
github.com/cloudwego/iasm v0.2.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.5 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/gin-gonic/gin v1.10.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.22.1 // indirect
github.com/goccy/go-json v0.10.3 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
golang.org/x/arch v0.10.0 // indirect
golang.org/x/crypto v0.27.0 // indirect
golang.org/x/net v0.29.0 // indirect
golang.org/x/sys v0.25.0 // indirect
golang.org/x/text v0.18.0 // indirect
google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

77
go.sum Normal file
View File

@ -0,0 +1,77 @@
github.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg=
github.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=
github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4=
github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27HYW8P9FDk5PbgA=
github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
golang.org/x/arch v0.10.0 h1:S3huipmSclq3PJMNe76NGwkBR504WFkQ5dhzWzP8ZW8=
golang.org/x/arch v0.10.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=

32
helloworld/main.go Normal file
View File

@ -0,0 +1,32 @@
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
//gin 的hello world
func main() {
//1.创建路由
// 默认使用了两个中间件 Logger(), Recovery()
r := gin.Default()
//r:=gin.New() //也可以创建不带中间件的路由
//2.绑定路由规则
//gin.Context 封装了request和response
r.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Hello world")
})
r.POST("/post", post)
r.PUT("/put")
//3.监听端口 默认在8080
r.Run(":8000")
}
func post(c *gin.Context) {
}

21
html-xuanran/main.go Normal file
View File

@ -0,0 +1,21 @@
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
//html渲染
func main() {
//创建路由
r := gin.Default()
//加载模板文件
r.LoadHTMLGlob("./templates/*")
r.GET("/index", func(c *gin.Context) {
//根据文件名渲染
//JSON将title替换
c.HTML(http.StatusOK, "index.tmpl", gin.H{"title": "我的标题"})
})
r.Run(":8000")
}

View File

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="http://localhost:8000/loginform" method="post" enctype="application/x-www-form-urlencoded">
用户名:
<input type="text" name="username">
<br>
&nbsp&nbsp码:
<input type="password" name="password">
<input type="submit" name="login">
</form>
</body>
</html>

View File

@ -0,0 +1,85 @@
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type Login struct {
//binding:"required" required 修饰的字段,若接受为控制 则报错 是必选字段
User string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"`
Password string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}
func main() {
//绑定JSON-结构体
//bindJson()
//绑定form-结构体
//bindForm()
//绑定uri-结构体
//bindUri()
}
func bindJson() {
r := gin.Default()
//Json绑定
r.POST("/loginJSON", func(c *gin.Context) {
//声明接收的变量
var json Login
//将request中的body自动按照json格式解析到结构体
//gin.H封装了生成json数据的工具
if err := c.ShouldBindJSON(&json); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
//判断用户名密码是否正确
if json.User != "admin" || json.Password != "admin" {
c.JSON(http.StatusUnauthorized, gin.H{"error": "wrong username or password"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "ok"})
})
r.Run(":8000")
}
func bindForm() {
r := gin.Default()
r.POST("/loginform", func(c *gin.Context) {
var form Login
//Bind()默认解析并绑定form格式
//根据请求头中的content-type自动推断
if err := c.Bind(&form); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
if form.User != "admin" || form.Password != "admin" {
c.JSON(http.StatusUnauthorized, gin.H{"error": "wrong username or password"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "ok"})
})
r.Run(":8000")
}
// http://127.0.0.1/admin/admin
func bindUri() {
r := gin.Default()
r.GET("/:user/:password", func(c *gin.Context) {
var login Login
//Bind()默认解析并绑定form格式
//根据请求头中的content-type自动推断
if err := c.ShouldBindUri(&login); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
if login.User != "admin" || login.Password != "admin" {
c.JSON(http.StatusUnauthorized, gin.H{"error": "wrong username or password"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "ok"})
})
r.Run(":8000")
}

52
middleware/main.go Normal file
View File

@ -0,0 +1,52 @@
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"time"
)
//定义一个GIN中间件
func middleware() gin.HandlerFunc {
return func(c *gin.Context) {
t1 := time.Now()
fmt.Println("中间件开始执行了")
//设置变量到context的key中,可以通过GET取到
c.Set("request", "中间件")
//执行函数 拦截handler
c.Next()
status := c.Writer.Status()
fmt.Println("中间件执行完毕", status)
t2 := time.Since(t1)
fmt.Println("time: ", t2)
}
}
func main() {
//1.创建路由
r := gin.Default()
//注册中间件
r.Use(middleware())
//{}是为了代码规范
{
r.GET("/middleware", func(c *gin.Context) {
//取值
req, _ := c.Get("request")
fmt.Println("req:", req)
//页面接收
c.JSON(200, gin.H{"request": req})
})
//跟路由后面是定义的局部中间件
r.GET("/middleware2", middleware(), func(c *gin.Context) {
//取值
req, _ := c.Get("request")
fmt.Println("req:", req)
//页面接收
c.JSON(200, gin.H{"request": req})
})
}
r.Run(":8000")
}

36
middleware/practice.go Normal file
View File

@ -0,0 +1,36 @@
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"time"
)
//定义一个中间件程序计时,执行函数后应该打印的执行时间
func timeCal(c *gin.Context) {
start := time.Now()
c.Next()
//统计时间
since := time.Since(start)
fmt.Println("程序耗时", since)
}
func main() {
r := gin.Default()
r.Use(timeCal)
shopping := r.Group("/shopping")
{
shopping.GET("/index", shopIndexHandler)
shopping.GET("/home", shophomeHandler)
}
r.Run(":8000")
}
func shopIndexHandler(c *gin.Context) {
time.Sleep(time.Second * 5)
}
func shophomeHandler(c *gin.Context) {
time.Sleep(time.Second * 3)
}

50
multiple-response/main.go Normal file
View File

@ -0,0 +1,50 @@
package main
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/testdata/protoexample"
)
var r = gin.Default()
// 多种响应方式
func main() {
//1.JSON
r.GET("/someJSON", func(c *gin.Context) {
c.JSON(200, gin.H{"someJson": true})
})
//2.结构体响应
r.GET("/someStruct", func(c *gin.Context) {
var msg struct {
Name string
Massage string
Num int
}
msg.Name = "hello"
msg.Num = 100
msg.Massage = "root"
c.JSON(200, &msg)
})
//3.XML
r.GET("/someXml", func(c *gin.Context) {
c.XML(200, gin.H{"someXml": true})
})
//4.YAML响应
r.GET("/someYaml", func(c *gin.Context) {
c.YAML(200, gin.H{"someYaml": true})
})
//5.protobuf格式谷歌开发的高效存储读取的工具
r.GET("/someProtobuf", func(c *gin.Context) {
reps := []int64{int64(1), int64(2)}
//定义数据
label := "label"
//传protobuf格式数据
data := &protoexample.Test{
Label: &label,
Reps: reps,
}
c.ProtoBuf(200, data)
})
r.Run(":8000")
}

15
redirect/main.go Normal file
View File

@ -0,0 +1,15 @@
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/redirect", func(c *gin.Context) {
//支持内部和外部重定向
c.Redirect(http.StatusMovedPermanently, "http://www.baidu.com")
})
r.Run(":8000")
}

32
routers-group/main.go Normal file
View File

@ -0,0 +1,32 @@
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
//路由组处理GET请求
v1 := r.Group("/v1")
//{}是书写规范
{
v1.GET("/login", login)
v1.GET("/submit", submit)
}
v2 := r.Group("/v2")
{
v2.POST("/login", login)
v2.POST("/submit", submit)
}
r.Run(":8000")
}
func login(c *gin.Context) {
name := c.DefaultQuery("name", "Jack")
c.String(200, fmt.Sprintf("hello:%s", name))
}
func submit(c *gin.Context) {
name := c.DefaultQuery("name", "lily")
c.String(200, fmt.Sprintf("hello:%s", name))
}

10
session/main.go Normal file
View File

@ -0,0 +1,10 @@
package main
//session中间件开发
//1.session模块设计
//本质上就是k-v。通过key进行增删改查
//session可以存储在内存或者redis中
func main() {
}

27
sync_async/main.go Normal file
View File

@ -0,0 +1,27 @@
package main
import (
"github.com/gin-gonic/gin"
"log"
"time"
)
func main() {
r := gin.Default()
r.GET("/log_async", func(c *gin.Context) {
//1.异步
//启动goroutine时不应该使用原始上下文应该使用副本来处理
copyContext := c.Copy()
go func() {
//异步处理
time.Sleep(3 * time.Second)
log.Println("异步执行:" + copyContext.Request.URL.Path)
}()
})
//2.同步
r.GET("/log_sync", func(c *gin.Context) {
time.Sleep(3 * time.Second)
log.Println("同步执行:" + c.Request.URL.Path)
})
r.Run(":8000")
}

5
templates/index.tmpl Normal file
View File

@ -0,0 +1,5 @@
<html>
<h1>
{{.title}}
</h1>
</html>

22
url-param/main.go Normal file
View File

@ -0,0 +1,22 @@
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
// url 参数
// 可以通过DefaultQuery()或者Query()方法获取
// DefaultQuery() 若参数不存在则返回默认值
// Query() 若参数不存在 则返回空串
func main() {
r := gin.Default()
r.GET("/welcome", func(c *gin.Context) {
name := c.DefaultQuery("name", "wangao") //第二个参数是默认值
c.String(http.StatusOK, fmt.Sprintf("hello %s", name))
})
r.Run(":8000")
//访问 /welcome 返回的是hello wangao (默认值)
//访问 /welcome?name=Jack 返回的是hello Jack
}