这是我参与「第五届青训营」伴学笔记创作活动的第 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/getXxx | Get blog/Xxx |
| 添加 | /blog/addXxx | POST blog/Xxx |
| 修改 | /blog/updateXxx | PUT blog/Xxx |
| 删除 | /blog/delXxxx | DELETE blog/Xxx |
template 模板
go内置了 text/template 和 html/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>
返回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
}