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

Go Web 开发必备理论知识

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

漫步发布于 2026/4/6更新于 2026/5/2429 浏览
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 核心区别
    • 💰 8折买阿里云服务器限时8折了解详情
    • Magick API 一键接入全球大模型注册送1000万token查看
    • 🤖 一键搭建Deepseek满血版了解详情
    • 一键打造专属AI 智能体了解详情
    极客日志微信公众号二维码

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

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

    更多推荐文章

    查看全部
    • C++ 嵌套类详解:概念、作用与实现细节
    • 宇树 G1 机器人基于 FAST-LIO 的建图与配置实战
    • LW-CTrans: 用于 3D 医学图像分割的轻量级 CNN-Transformer 混合网络
    • Java JUnit NoSuchMethodError 异常处理与版本兼容修复
    • Mac 环境 GoLand 安装与配置指南
    • OpenClaw 龙虾机器人 Windows 系统部署全攻略
    • 基于 Llama-Factory 的 ASR 转写文本润色实践
    • 复杂三维山地环境下多无人机动态避障路径规划及小龙虾优化算法
    • DeskClaw 人机共管平台本地部署与实战教程
    • AI 领域必读精选:6 部名家名作
    • STL Vector 模拟实现:从底层原理到核心接口解析
    • 昇腾 NPU 部署 Llama 2 模型的性能测试与优化实践
    • Webots 2025a 与 ROS 2 Jazzy e-puck 机器人集成实战
    • 双指针算法专题:三角形个数与多数之和问题
    • 系统并发流量承载能力验证与高并发架构设计
    • C++ 笔试刷题 Day 11:水果礼包、股票买卖与字符串倒置
    • DeepSeek 技术文化观察:AI 视角下的开发者生态
    • Open-WebUI 管理员面板深度拆解与配置指南
    • JavaScript 语言特性与常见误解分析
    • C++ 开发者转 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