跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Go / Golang

Go Web 开发核心理论与实战

Go Web 开发涉及 HTTP 协议基础、状态码分类、数据库操作及常见功能实现。涵盖 HTTP 版本演进、缓存机制、HTTPS 原理、Cookie 与 Session 管理。介绍 MySQL 连接、增删改查 SQL 语句、文件上传下载、模板引擎使用及控制器设计。对比 GET 与 POST 方法在语义、参数传递及幂等性上的差异。

晚风告白发布于 2026/4/7更新于 2026/5/2318 浏览
Go Web 开发核心理论与实战

Go Web 开发核心理论与实战

HTTP 状态码

意义

HTTP 状态码是 HTTP 设计者对网络通讯中可能出现情况的假设与预判,相当于现实世界的信号灯。例如遇到 404 表示资源找不到,500 表示服务器内部错误。这种共识是万维网高效运行的基础之一。

必须掌握的状态码

  • 200 OK:请求完全正确,如打开网页、调用 API。
  • 301 Moved Permanently:资源永久迁移(如 a.com 重定向到 b.com)。
  • 302 Found:资源临时迁移。
  • 400 Bad Request:请求出错,如参数缺失。
  • 401 Unauthorized:未登录或认证失败。
  • 403 Forbidden:已登录但无权限。
  • 404 Not Found:资源不存在。
  • 500 Internal Server Error:服务器内部错误。

需要理解的状态码

排查问题时常用:

  • 100 Continue:继续发送请求体。
  • 201 Created:资源创建成功(POST)。
  • 204 No Content:处理成功但不返回资源(DELETE)。
  • 206 Partial Content:部分内容传输成功。
  • 304 Not Modified:资源未修改,使用缓存。
  • 405 Method Not Allowed:方法不被允许。
  • 408 Request Timeout:请求超时。
  • 502 Bad Gateway:网关/代理收到无效响应。
  • 503 Service Unavailable:服务器暂不可用(如维护、高并发)。

文章配图

HTTP 协议

核心概念

1. HTTP 的本质
  • 定义:超文本传输协议。
  • 核心模型:【请求 + 响应】客户端发送请求,服务器响应,一问一答传递信息。
  • 无状态:服务器不会记住上一次请求(后期引入 Cookie、Session 解决)。
  • 位置:应用层,规范客户端与服务器的传输格式和交互流程。
2. URL 结构

示例:https://www.example.com:8080/path?name=test#fragment

  • https:协议类型。
  • www.example.com:域名(对应服务器 IP)。
  • 8080:端口号(HTTP 默认 80,HTTPS 默认 443,可省略)。
  • /path:资源路径。
  • ?name=test:GET 请求携带的参数。
  • #fragment:锚点。
3. 请求方法 (Method)
  • GET:请求资源,不改变服务器资源。
  • POST:提交数据,在服务器创建新资源。
  • PUT:更新数据,若无资源则新建(幂等)。
  • DELETE:删除数据(通常返回 204)。
  • PATCH:修改部分资源(与 PUT 类似,但仅更新部分)。
4. 状态码分类
  • 1xx:信息性状态码
  • 2xx:请求成功
  • 3xx:重定向
  • 4xx:客户端错误
  • 5xx:服务器错误

进阶必备知识

1. HTTP 版本演进
  • HTTP/1.0:每次访问重新建立连接。
  • HTTP/1.1:持久化连接,但只能串行发送请求。
  • HTTP/2:多路复用(一个连接同时发多个请求,互不阻塞)。
  • HTTP/3:基于 UDP 的 QUIC 协议,解决 TCP 队头堵塞问题。
2. 缓存机制
  • 强缓存:通过 Cache-Control: max-age=3600 告诉浏览器 1 小时内强制使用本地缓存,除非强制刷新(Ctrl+F5)。
  • 协商缓存:强缓存过期后,浏览器带 If-Modified-Since 或 Etag 请求,服务器判断未修改则返回 304。
3. HTTPS 原理

HTTPS = HTTP + TLS。

  • 核心区别:HTTP 明文传输,HTTPS 加密传输。
  • SSL/TLS 作用:
    1. 加密:将明文变为密文,防止截获破解。
    2. 身份认证:验证服务器身份,防止钓鱼网站。
    3. 完整性校验:确保信息未被篡改。
4. Cookie 和 Session
  • Cookie:服务器通过 Set-Cookie 在客户端存储信息,解决 HTTP 无状态问题。
  • Session:服务端存储用户信息,与 Cookie 中的 session_id 关联。登录时服务器设置 session_id 到 Cookie,后续通过 ID 查找 Session 信息。
5. 跨域资源共享 (CORS)
  • 跨域:协议、域名、端口任意不同即属于跨域。
  • 解决:服务器返回 Access-Control-Allow-Origin 响应头,允许指定域名跨域请求。

MySQL 的连接与增删改查

本篇通过 sqlx 包操作数据库,进行通用拓展。

连接

import (
	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
)

// 核心步骤
DB, err := sqlx.Open("mysql", "root:password@tcp(localhost:3306)/goweb?parseTime=true&loc=Local")
if err != nil {
	log.Fatal(err)
}
err = DB.Ping()

增删改查

// 语句定义
queryCreate := "insert into user (id,name) values (?,?)"
queryDelete := "delete from user where id =?"
queryUpdate := "update user set name=? where id=?"
queryQuery := "select * from user"

// 执行
// 增:DB.Exec(queryCreate, 1, "test_user")
// 删:DB.Exec(queryDelete, 1)
// 改:DB.Exec(queryUpdate, "admin", 1)
// 查:rows, err := DB.Query(queryQuery)
// for rows.Next() {
//     var id int
//     var name string
//     rows.Scan(&id, &name)
// }

Cookie

后端的核心操作

func serv(w http.ResponseWriter, r *http.Request) {
    // cookie 赋值
    cookie := &http.Cookie{
        Name:  "session_id",
        Value: "cookie_value",
        Expires: time.Now().Add(time.Hour),
    }
    http.SetCookie(w, cookie)

    // 获取单个 cookie
    c, _ := r.Cookie("session_id")
    fmt.Fprintln(w, c.Name, c.Value, c.Expires)

    // 循环获取 cookie
    cs := r.Cookies()
    for _, co := range cs {
        fmt.Fprintln(w, co.Name, co.Value)
    }
}

Template

模板引擎用于解耦控制器 (Controller) 与视图 (View),实现 MVC 架构。 模板是包含占位符与控制逻辑的预制文本,通过动态填充生成最终输出。

// 后端界面
func temp(w http.ResponseWriter, r *http.Request) {
    add := template.FuncMap{"add": AddFunc}
    t := template.New("index").Funcs(add)
    t, _ = t.ParseFiles("new_add")
    t.Execute(w, nil)
}

前端模板语法:{{add 0 0}}

上传

从浏览器向服务器传输数据。

HTML:

<form action="/upload" enctype="multipart/form-data" method="post">
    上传照片:<input type="file" name="photo">
</form>

Go:

func upload(w http.ResponseWriter, r *http.Request) {
    f, _, _ := r.FormFile("photo")
    b, _ := io.ReadAll(f)
    err := os.WriteFile("./uploads/photo.jpg", b, 0777)
    if err != nil {
        fmt.Println("上传失败")
    }
}

下载

<a href="/download?filename=file.png">点击下载</a>
func download(w http.ResponseWriter, r *http.Request) {
    name := r.FormValue("filename")
    data, _ := os.ReadFile("./files/" + name)
    h := w.Header()
    h.Set("Content-Type", "application/octet-stream")
    h.Set("Content-Disposition", `attachment; filename="`+name+""`)
    w.Write(data)
}

控制器

单控制器

type myStruct struct{}

func (m *myStruct) ServeHTTP(w http.ResponseWriter, r *http.Request) {}

func main() {
    s := http.Server{
        Addr:    "localhost:8888",
        Handler: &myStruct{},
    }
    s.ListenAndServe()
}

多控制器

func Test(w http.ResponseWriter, r *http.Request) {}

func main() {
    server := http.Server{Addr: "localhost:8888"}
    http.HandleFunc("/url", Test)
    server.ListenAndServe()
}

GET 与 POST 核心区别

需着重注意两者在语义、参数传递、幂等性、缓存等角度的本质区别。

角度GETPOST
语义获取资源提交资源
参数URL 查询字符串请求体
幂等性幂等(多次执行结果不变)非幂等(可能多次下单)
缓存易被缓存一般不缓存

目录

  1. Go Web 开发核心理论与实战
  2. HTTP 状态码
  3. 意义
  4. 必须掌握的状态码
  5. 需要理解的状态码
  6. HTTP 协议
  7. 核心概念
  8. 1. HTTP 的本质
  9. 2. URL 结构
  10. 3. 请求方法 (Method)
  11. 4. 状态码分类
  12. 进阶必备知识
  13. 1. HTTP 版本演进
  14. 2. 缓存机制
  15. 3. HTTPS 原理
  16. 4. Cookie 和 Session
  17. 5. 跨域资源共享 (CORS)
  18. MySQL 的连接与增删改查
  19. 连接
  20. 增删改查
  21. Cookie
  22. 后端的核心操作
  23. Template
  24. 上传
  25. 下载
  26. 控制器
  27. 单控制器
  28. 多控制器
  29. GET 与 POST 核心区别
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • OpenClaw 与本地千问模型搭建电脑 AI 助理
  • RTX 50 系显卡与 CUDA、PyTorch 及 Python 版本对应关系
  • Ubuntu 22.04 配置和启用 SSH 实现安全远程访问
  • Python 语言优势与核心应用场景解析
  • FLUX.1 镜像免配置部署:内置中文界面与中英双语 Web UI
  • 10 个开源免费的大模型学习资料推荐
  • OpenClaw 安装及飞书机器人配置流程指南
  • 人工智能该如何学习?详细的AI学习路线与资料推荐
  • Spring AI 结合 Ollama 构建离线私有化 AI 服务方案
  • C++原子操作:从底层原理到实战应用
  • Stable Diffusion 文生图基础详解与参数配置
  • 2025 年全国青少年信息素养大赛复赛真题:算法创意实践挑战赛 C++ 小学组试卷 2
  • go-zero 微服务架构核心与实战指南
  • Python uv 工具:安装、升级与卸载指南
  • AgentScope Java 多智能体框架
  • Python 正则表达式与网络爬虫实战练习
  • Ubuntu 20.04 系统下 QGroundControl 地面站安装教程
  • 前端开发中 TypeError: Failed to fetch 错误的原因与解决方法
  • C++11 核心新特性详解:初始化、声明与右值引用
  • Python 数据结构核心指南与常见面试题解析

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online