gin 框架(一) | 青训营笔记

88 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 13 天

HelloWorld

先从一个最简单的服务器开始。用原生go实现。

package main

import (
	"fmt"
	"net/http"
)

func main() {
	fmt.Println("Server is running on port 8080")
	defer fmt.Println("Server is stopped")
        
	http.HandleFunc("/hello", sayHello) // 挂载函数
	err := http.ListenAndServe(":8080", nil) // 监听端口
	if err != nil {
		fmt.Println("ListenAndServe: ", err)
		return
	}
}

func sayHello(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "<h1>Hello, world!</h1>") // 向w写入
}

web 开发主要就在于请求响应,需要注意的是在开发过程中两者也是对应出现的,我们要养成这种对应的习惯。

要清楚,框架是工具是轮子,不能没了轮子就不会跑。学习框架的过程不止要学习如何使用,还要了解它的设计理念,实现思路等。

Gin 简介

Gin 是一个用 Go (Golang) 编写的 Web 框架。 它具有类似 martini 的 API,性能要好得多,多亏了 httprouter,速度提高了 40 倍。

  • 快速
  • 支持中间件
  • Crash 处理
  • JSON 验证
  • 路由组
  • 错误管理
  • 内置渲染
  • 可扩展性

安装

Go > 1.13

下载并安装 gin :go get -u github.com/gin-gonic/gin

引入 gin :import "github.com/gin-gonic/gin"

demo

package main

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

func main() {
	r := gin.Default() // 返回一个默认的路由引擎
	r.GET("/hello", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // 默认监听8080
}

Restful风格的API

gin支持Restful风格的API

即Representational State Transfer的缩写。直接翻译的意思是"表现层状态转化",是一种互联网应用程序的API设计理念:URL定位资源,用HTTP描述操作

操作语义化地址Restful
获取/blog/getXxxGet blog/Xxx
添加/blog/addXxxPOST blog/Xxx
修改/blog/updateXxxPUT blog/Xxx
删除/blog/delXxxxDELETE blog/Xxx

template 模板

go内置了 text/templatehtml/template

由于现在的前后端分离趋势,后端一般只传 json 文件,所以这里就不过多介绍了。给一个简单的例子。

| - templates
    | - index.html
main.go
package main

import (
	"fmt"

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

func main() {
	fmt.Println("Server is running on port 8080")
	defer fmt.Println("Server is stopped")
	r := gin.Default()
	// r.Static("/static", "./static") // 静态文件
        // r.LoadHTMLGlob("templates/*")
	r.LoadHTMLFiles("templates/index.html") // 模板解析
	r.GET("/hello", func(c *gin.Context) { // 模板渲染
		c.HTML(200, "index.html", gin.H{
			"title": "Hello World",
		})
	})
	r.Run(":8080")
}

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>go-web</title>
</head>

<body>
    <h1>{{.title}}</h1>
</body>

</html>

image.png

返回json

一般只有临时返回的信息才用自定义json,最主要还是用结构体

自定义json

func main() {
	fmt.Println("Starting server...")
	defer fmt.Println("Server stopped.")
	r := gin.Default()
	r.GET("/hello", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"name":    "zhangsan",
			"age":     18,
			"message": "hello world",
		})
	})
	r.Run() // listen and serve on
}

结构体

type User struct {
	Name    string `json:"name"`
	Age     int    `json:"age"`
	Message string `json:"message"`
}

func main() {
	fmt.Println("Starting server...")
	defer fmt.Println("Server stopped.")
	r := gin.Default()
	r.GET("/hello", func(c *gin.Context) {
		data := User{
			Name:    "John",
			Age:     30,
			Message: "Hello World",
		}
		c.JSON(http.StatusOK, data)
	})
	r.Run() // listen and serve on
}

参考