Day 8: Go Web 框架快速上手
Table of Contents
Day 8:Go Web 框架快速上手
1. 背景与目标
在前几天的学习中,我们已经掌握了 Go 的基础语法、并发模型和一些工具链。今天我们要把 Go 作为 Web 后端语言 来使用。
本章目标:
- 理解 标准库
net/http
的特点与不足 - 熟悉 主流 Web 框架 Gin/Fiber 的用法
- 通过 实现用户注册与登录接口 来实战演练
2. 标准库 net/http
Go 内置的 net/http
非常简洁,它内置了 HTTP Server 和 Client,代码风格偏低级,但很灵活。
示例:Hello World
package main
import (
"fmt"
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, Go Web!")
}
func main() {
http.HandleFunc("/hello", helloHandler)
fmt.Println("Server started at :8080")
http.ListenAndServe(":8080", nil)
}
启动后访问 http://localhost:8080/hello
,即可看到返回的文本。
优点:
- 无需第三方依赖
- 简单、轻量
- 内置 HTTP 服务器性能不错
不足:
- 路由规则简单(只支持字符串匹配,不支持复杂路由参数)
- 没有内置的中间件机制(日志、鉴权要手写)
- JSON 解析/绑定/响应需要重复编码
3. Gin 框架
Gin 是目前 Go 最流行的 Web 框架,特点是 路由灵活、性能高、中间件生态丰富。
Hello World with Gin
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": "Hello Gin!"})
})
r.Run(":8080")
}
访问 http://localhost:8080/hello
即可返回 JSON。
优点:
- 内置 JSON 解析、绑定、响应
- 灵活的路由(支持参数和分组)
- 丰富的中间件(日志、鉴权、CORS 等)
- 社区活跃
4. Fiber 框架
Fiber 是一个受 Express.js 启发的 Web 框架,基于 fasthttp
,追求极致性能。
Hello World with Fiber
package main
import (
"github.com/gofiber/fiber/v2"
)
func main() {
app := fiber.New()
app.Get("/hello", func(c *fiber.Ctx) error {
return c.JSON(fiber.Map{"message": "Hello Fiber!"})
})
app.Listen(":8080")
}
Fiber 的 API 风格很像 Node.js 的 Express,上手更快。
5. 实战:实现用户注册与登录接口
我们来写一个简单的用户系统,包含 注册 + 登录 接口。
数据结构
type User struct {
Username string `json:"username"`
Password string `json:"password"`
}
为了简化,本例直接在内存里存储用户数据(真实项目会用数据库 + 密码哈希)。
Gin 实现
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
var users = make(map[string]string) // username -> password
func main() {
r := gin.Default()
// 用户注册
r.POST("/register", func(c *gin.Context) {
var user User
if err := c.ShouldBindJSON(&user); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid input"})
return
}
if _, exists := users[user.Username]; exists {
c.JSON(http.StatusConflict, gin.H{"error": "User already exists"})
return
}
users[user.Username] = user.Password
c.JSON(http.StatusOK, gin.H{"message": "User registered successfully"})
})
// 用户登录
r.POST("/login", func(c *gin.Context) {
var user User
if err := c.ShouldBindJSON(&user); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid input"})
return
}
if pwd, exists := users[user.Username]; !exists || pwd != user.Password {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid username or password"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "Login successful"})
})
r.Run(":8080")
}
type User struct {
Username string `json:"username"`
Password string `json:"password"`
}
测试
使用 curl 或 Postman:
注册:
curl -X POST http://localhost:8080/register \
-H "Content-Type: application/json" \
-d '{"username":"alice","password":"123456"}'
登录:
curl -X POST http://localhost:8080/login \
-H "Content-Type: application/json" \
-d '{"username":"alice","password":"123456"}'
6. 小结
- Go 标准库
net/http
简洁但偏底层 - Gin 提供了现代 Web 开发需要的路由、中间件、JSON 支持
- Fiber 更适合追求极致性能的场景
- 通过注册/登录接口实践,我们学会了 API 的设计和 JSON 处理
✅ 今天的练习任务:
- 用
net/http
写一版注册/登录接口 - 用 Gin 写一版(如上所示)
- 思考:如果要把密码存数据库,应该如何设计?
Comments |0|
Category: 似水流年