Day 8: Go Web 框架快速上手

Table of Contents

Day 8:Go Web 框架快速上手

1. 背景与目标

在前几天的学习中,我们已经掌握了 Go 的基础语法、并发模型和一些工具链。今天我们要把 Go 作为 Web 后端语言 来使用。

本章目标:

  1. 理解 标准库 net/http 的特点与不足
  2. 熟悉 主流 Web 框架 Gin/Fiber 的用法
  3. 通过 实现用户注册与登录接口 来实战演练

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 处理

✅ 今天的练习任务:

  1. net/http 写一版注册/登录接口
  2. 用 Gin 写一版(如上所示)
  3. 思考:如果要把密码存数据库,应该如何设计?

Comments |0|

Legend *) Required fields are marked
**) You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Category: 似水流年