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

Go Web 开发必备理论知识

Go Web 开发的基础理论,涵盖 HTTP 状态码分类与含义、HTTP 协议核心模型及版本演进、缓存机制与 HTTPS 原理。详细讲解了使用 sqlx 包进行 MySQL 数据库的连接与增删改查操作,以及 Cookie 和 Session 的会话管理机制。此外,还包含了模板引擎的使用、文件上传下载的代码实现、控制器模式的区别,以及 GET 与 POST 请求在语义、参数、幂等性和缓存方面的核心差异。

漫步发布于 2026/4/6更新于 2026/9/466 浏览
Go Web 开发必备理论知识

HTTP 状态码

意义

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

HTTP 状态码是日常开发与调试的必备工具。常见状态码分类如下:

必须掌握的状态码

  • 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,解决 TCP 队头堵塞问题。

2. 缓存机制

  • 强缓存:通过 Cache-Control: max-age=3600 告诉浏览器 1 小时内强制使用本地缓存。
  • 协商缓存:强缓存过期后,浏览器带 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 关联。

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:1234@tcp(localhost:3306)/goweb?parseTime=true&loc=Local")
if err != nil {
	// handle error
}
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, "白小纯")
DB.Exec(queryDelete, 1)
DB.Exec(queryUpdate, "夜藏", 1)
rows, err := DB.Query(queryQuery)
for rows.Next() {
	var id int
	var name string
	rows.Scan(&id, &name)
}

Cookie

起源与应用

Cookie 源于 Unix 中的 "magic cookie",用于程序间传递特定信息。后端核心操作示例:

func serv(w http.ResponseWriter, r *http.Request) {
	// 设置 Cookie
	cookie := &http.Cookie{
		Name:    "session_id",
		Value:   "cookie",
		Expires: time.Now().Add(time.Second),
	}
	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)。它是包含占位符与控制逻辑的预制文本,通过动态填充输出。

func temp(w http.ResponseWriter, r *http.Request) {
	add := template.FuncMap{"add": Add}
	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 Handler:

func upload(w http.ResponseWriter, r *http.Request) {
	f, _, _ := r.FormFile("photo")
	b, _ := io.ReadAll(f)
	err := os.WriteFile("/tmp/photo", 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=photo")
	w.Write(data)
}

控制器

单控制器

实现 http.Handler 接口。

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()
}

多控制器

使用 http.HandleFunc 注册路由。

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

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

GET 与 POST 核心区别

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

目录

  1. HTTP 状态码
  2. 意义
  3. 必须掌握的状态码
  4. 需要理解的状态码
  5. HTTP 协议
  6. 核心概念
  7. 1. HTTP 的本质
  8. 2. URL 结构
  9. 3. 请求方法(Method)
  10. 4. 状态码分类
  11. 进阶知识
  12. 1. HTTP 版本演进
  13. 2. 缓存机制
  14. 3. HTTPS 原理
  15. 4. Cookie 和 Session
  16. 5. 跨域资源共享(CORS)
  17. MySQL 的连接与增删改查
  18. 连接
  19. 增删改查
  20. Cookie
  21. 起源与应用
  22. Template
  23. 上传与下载
  24. 上传
  25. 下载
  26. 控制器
  27. 单控制器
  28. 多控制器
  29. GET 与 POST 核心区别

更多推荐文章

查看全部
  • Git 强制推送后提交仍可通过哈希访问
  • Stable Diffusion 完整训练与推理流程详解(含伪代码)
  • Java 虚拟机核心机制:类加载与垃圾回收详解
  • 在昇腾 NPU 上部署 Llama 大模型:全流程实战与踩坑指南
  • Python 异步爬虫结合 K8S 弹性伸缩构建高并发采集引擎
  • Enterprise Architect 16 下载、安装与无限30天操作
  • C++ 继承机制详解:同名成员调用与隐藏规则
  • Stable Diffusion 与 kohya_ss 安装指南
  • 20 个 Python 自动化脚本实战:文件管理与办公效率提升
  • OpenCode 使用 GitHub Copilot 计费异常分析与解决方案
  • 使用 trae 集成安装 Claude Code 实践指南
  • Stable Diffusion 秋叶整合包本地部署与使用指南
  • LangFlow 对接主流大模型实战指南:Llama、ChatGLM、Qwen
  • Gazebo 机器人三维物理仿真平台
  • 跳表原理及复杂度分析
  • Python 实现 MCP 客户端调用高德地图天气查询示例
  • C++ 实现红黑树:深入理解 STL map 底层原理
  • OpenAI 与 LangChain 集成实战指南
  • MISRA C++静态分析报告解读与实战指南
  • Trae 整合 Figma MCP 实现前端代码自动生成

相关免费在线工具

  • 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