gin基本操作 | 青训营

250 阅读5分钟

初探(忽略go基础)

1.安装go和gin

很奇妙的一个过程,特别是安装gin,很多带佬都整理了教程

2. hello world

这是gin文档开始的示例代码

package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}

  1. import "github.com/gin-gonic/gin":导入Gin框架的包,以便使用Gin提供的功能。
  2. func main():程序入口函数。
  3. r := gin.Default():创建一个默认的Gin引擎实例,gin.Default()方法会返回一个带有默认中间件的Gin引擎。Gin引擎是用于处理HTTP请求的核心对象。
  4. r.GET("/ping", func(c *gin.Context) { ... }):定义一个HTTP GET路由,当客户端通过GET请求访问"/ping"路径时,将执行匿名函数中的代码。这里要注意哟,一定要加/ping image.png
  5. c.JSON(200, gin.H{ "message": "pong", }):在匿名函数中,使用c.JSON()方法返回一个JSON响应。c.JSON()方法的第一个参数是HTTP状态码,这里使用了200表示成功。第二个参数是一个Gin框架中的gin.H类型,它是一个map[string]interface{}类型的简写,用于构建JSON响应的键值对。
  6. r.Run():启动Gin服务,监听来自客户端的HTTP请求,并在默认地址"0.0.0.0:8080"上提供服务。()里可以指定端口号

初探gin.Context中一些方法

1. 方法:c.JSON(code int, obj any):用于向客户端发送JSON格式的HTTP响应。

  • 源码:
func (c *Context) JSON(code int, obj any) {  
    c.Render(code, render.JSON{Data: obj})  
}
  • 解释:
  1. code int:这是HTTP响应的状态码,表示请求的处理状态,例如200表示成功,404表示未找到,500表示服务器内部错误等。

  2. obj any:这是一个空接口类型,表示要返回的JSON数据。由于是空接口类型,obj可以接受任何类型的值作为JSON数据。

  3. c.Render(code, render.JSON{Data: obj}):这是使用Gin框架中的Render方法来实现JSON响应的关键部分。它接收两个参数:HTTP状态码和一个Gin框架中的render.JSON结构体。在这里,将obj作为JSON数据传递给render.JSON{Data: obj}

  4. render.JSON{Data: obj}表示构建一个render.JSON结构体,并将obj赋值给其Data字段,该结构体用于生成JSON响应。

2. 方法:c.string(code int, format string, values ...any):用于向客户端发送字符串格式的HTTP响应。

  • 源码:
func (c *Context) String(code int, format string, values ...any) {  
    c.Render(code, render.String{Format: format, Data: values})  
}
  • 解释:
  1. code int:这是HTTP响应的状态码,表示请求的处理状态。

  2. format string:这是一个字符串格式化参数,类似于 fmt.Sprintf() 的格式化字符串。

  3. values ...any:这是一个空接口类型的可变参数,表示要填充到格式化字符串中的值。由于是空接口类型,values 可以接受任何类型的参数。也可以不传

  4. c.Render(code, render.String{Format: format, Data: values}):这是使用Gin框架中的 Render 方法来实现字符串响应的关键部分。它接收两个参数:HTTP状态码和一个Gin框架中的 render.String 结构体。

  5. 在这里,将 format 作为格式化字符串, values 用于替换格式化字符串中的占位符,传递给 render.String{Format: format, Data: values}

  6. render.String{Format: format, Data: values} 表示构建一个 render.String 结构体,其中 Format 字段表示要格式化的字符串,而 Data 字段表示要填充到格式化字符串中的值,用于生成字符串响应。

  • 示例:
func main() {  
    r := gin.Default()  
    r.GET("/ping", func(c *gin.Context) {  
        c.String(200, "h%vello %s", 6, "world")  
    })  
    r.Run() // 监听并在 0.0.0.0:8080 上启动服务  
}
  • 浏览器访问:

image.png

3. c.HTML(code int, name string, obj any):于向客户端发送HTML格式的HTTP响应。

源码:

func (c *Context) HTML(code int, name string, obj any) {  
    instance := c.engine.HTMLRender.Instance(name, obj)  
    c.Render(code, instance)  
}

解释:

  1. code int:这是HTTP响应的状态码,表示请求的处理状态.

  2. name string:这是一个字符串,表示要使用的HTML模板的名称。

  3. obj any:这是一个空接口类型,表示要传递给HTML模板的数据。由于是空接口类型,obj 可以接受任何类型的数据。

  4. c.engine.HTMLRender.Instance(name, obj):这是通过 HTMLRender 对象实例化一个HTML模板,并将 obj 作为模板的数据。

  5. c.engine.HTMLRender 表示Gin框架中的HTML模板渲染器,HTMLRender.Instance() 方法用于根据模板名称和数据生成一个模板实例。

  6. c.Render(code, instance):这是使用Gin框架中的 Render 方法来实现HTML响应的关键部分。它接收两个参数:HTTP状态码和HTML模板实例。

示例:

  • 后端代码
//后端代码
func main() {  
    r := gin.Default()  
    //  预加载指定的HTML文件
    r.LoadHTMLFiles("helloworld.html")  
    // 设置路由用于返回date数据和渲染helloworld.html页面  
    r.GET("/ping", func(c *gin.Context) {  
        data := "HelloWorld"  
        // 使用c.HTML方法渲染helloworld.html页面并传递date数据  
        c.HTML(200, "helloworld.html", gin.H{  
            "Date": data,  
        })  
    })  
    r.Run(":8080") // 监听并在0.0.0.0:8080上启动服务  
}
  • 前端代码
<!DOCTYPE html>  
<html>  
<head>  
   <title>HelloWorld HTML Page</title>  
</head>  
<body>  
<h1>{{.Date}}</h1>  
</body>  
</html>
  • gin.H{}处理请求时构建键值对(Key-Value)形式的数据集合。这个数据集合通常用于传递给Gin框架中的渲染方法,以在HTTP响应中返回数据给前端。

  • {{.Date}} 是Go语言模板引擎的语法,用于在模板中插入数据。在Gin框架中,当使用 c.HTML() 方法渲染HTML页面时,你可以通过将数据传递给模板引擎来动态地在HTML页面中插入数据。

  • c.HTML() 方法中,第三个参数是一个键值对形式的数据集合,其中键是字符串类型,值可以是任何类型的数据,因为使用了 interface{} 作为值的类型。在Go语言模板引擎中,你可以通过 {{.KeyName}} 的语法来引用传递给模板的数据集合中的键对应的值。

  • 运行此示例浏览器显示:

    image.png

到点下班!

本人蒟蒻(有点java基础),希望大佬指点