这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《Go 语言运行时原理》2.1 G/M/P 结构与状态机
G/M/P 是什么,站内 Go 专题已经讲过。本节只写增量:用 GODEBUG=scheddetail=1 的真实回显,把每个 goroutine 的 status 与 waitreason 逐字段读出来,再定位到 src/runtime/runtime2.go 的状态常量与 g/m/p 结构体,最后给出一张可直接对照的状态迁移表。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
G/M/P 是什么,站内 Go 专题已经讲过。本节只写增量:用 GODEBUG=scheddetail=1 的真实回显,把每个 goroutine 的 status 与 waitreason 逐字段读出来,再定位到 src/runtime/runtime2.go 的状态常量与 g/m/p 结构体,最后给出一张可直接对照的状态迁移表。
本节解释内嵌 H2 为何会掩盖 PostgreSQL 方言差异,给出 Testcontainers 2.0 在 Spring Boot 4.x 下的依赖坐标、@ServiceConnection 用法与共享容器模式,讲清容器复用、CI 里 Docker 的可用性前提,并附镜像拉取、端口、健康检查三类失败的排查清单。
这三个包原本只能从 golang.org/x/crypto 拿,Go 1.24 把它们收进了标准库。本节实测 SHA-3/SHAKE 输出与 NIST 向量一致、HKDF 派生 42 字节、PBKDF2 派生 32 字节,并给出三者的版本归属(均在 1.24,SHA3.Clone 在 1.25),最后用一张决策表说清「什么时候该用哪个 KDF」。
后量子密钥封装 ML-KEM(FIPS 203)在 Go 1.24 进了标准库。本节实测 768 与 1024 两套参数的完整往返、打印密钥与密文长度、验证从种子重建密钥,并揭示一个反直觉的点:密文被篡改时 Decapsulate 不报错、而是走隐式拒绝返回另一个密钥。附 api 证据与 tlsmlkem 开关状态。
用 filepath.Join 拼接用户输入是经典的目录穿越漏洞。Go 1.24 引入 os.Root 把「只能访问某个目录树」做成内核级保证。本节实测相对路径、绝对路径、符号链接三种逃逸全部被挡在 root 之外,并给出 OpenRoot 的 1.24 版本证据与 1.25 方法集扩充(11→23 个方法)的对照。
从 minagent 全卷交付建立离线 ResearchCopilot 骨架,提供完整基础配置、桥接代码和 Python/Node 冒烟测试,明确打包、lint 与远程 CI 的待验证前提。
本节给 ResearchCopilot 画出四层边界:卷一的 minagent 引擎层、FastAPI 服务层、异步 worker 层、Postgres 加 Redis 的存储层。我们用一张 ASCII 图和一张职责表说清每层管什么、不该管什么,用可跑的检查脚本钉死依赖方向,并完整走一遍一个提问从进来到出结果、跨四层的时序。
本节为 ResearchCopilot 立下 3 个可验收的核心用例:单跳事实问答、多跳研究并输出带引用报告、后台周期 digest。每个用例都给出量化验收标准与落地章节映射,并明确列出不做通用聊天、不做 MCP Server 实现、不做多租户计费这三条边界,把项目范围钉死在可交付的一小块上。
TaskHub 依赖几十个模块,其中任何一个的已知漏洞都可能成为攻击面。本节实测 govulncheck v1.8.0 的三种扫描层级(module/package/symbol),用真实输出说明「模块有漏洞」与「你的代码真的调用了漏洞函数」的区别,并演示它如何顺带产出 SBOM 与 SARIF,接进 CI。
依赖不会永远停在原版本:要升级、要临时指向 fork、要让公司内网的私有仓库能被解析。本节实测 go get -u 与 -u=patch 的差异、replace 指向本地目录的效果,以及 GOPRIVATE/GONOPROXY/GONOSUMDB 三件套如何把私有模块从公共代理里摘出来,附 TaskHub 的升级纪律。
TaskHub 的四个模块各自声明依赖版本,冲突迟早会发生。本节用 x/text 与 x/net 两个真实模块实测最小版本选择的裁决过程:直接要求 v0.14.0 却因间接依赖被抬到 v0.19.0,再演示 go get 强制降级报错、go mod graph 定位引入者、exclude 干预的完整排查链路。
本节讲解服务进程如何正确地「活着」与「死去」:从 SIGTERM 信号处理、连接排空与资源释放的关闭流程,到 liveness、readiness、startup 三类健康检查的语义差异与实现方式。你将学会为数据库、缓存等依赖编写带超时的探活,并把探针与容器、编排系统配置对齐,避免发布期间丢请求或误判重启。
本节讲解 HTTP 服务的横切关注点如何组织:从洋葱模型与 Fastify hooks 的执行顺序,到用 AsyncLocalStorage 建立请求级上下文并贯穿日志与追踪,再到把认证结果类型安全地挂到请求对象上。你将掌握认证、校验、限流、错误收口四类中间件的写法与顺序约束,并学会避免重复执行与上下文丢失两类高频故障。
本节从 Node 原生 http 模块的类型缺口讲起,对比 Fastify 与 Hono 两套框架的路由声明、请求校验与类型推导方式。你将学会用 JSON Schema 与 Zod 让请求参数自动获得类型,用插件与分组路由组织大型服务的路由树,并理解 Web 标准 Request/Response 在边缘运行时上的取舍。读完后你能按部署形态选出合适框架,写出端到端类型安全的接口层。
本节用图书借阅服务的借阅流程,把单元、切片、集成、端到端四层测试的成本与收益逐项拆开,给出各层配比与 CI 分阶段执行命令,并对齐 Spring Boot 4.x 的测试注解口径(@MockitoBean、RestTestClient、@AutoConfigureMockMvc),最后讲清测试并行与上下文缓存的取舍。
图书服务要加一个管理页面,HTML、CSS、JS 与封面图该放哪、用什么 URL 访问?本节讲清 Spring Boot 四个默认静态资源目录及优先级、默认 /** 映射规则,区分 static-locations 与 static-path-pattern,并演示自定义映射、缓存控制与内容哈希指纹,最后说清静态资源与接口路径冲突时谁优先。
给测试体系补上三块短板:用 hypothesis 的性质测试突破手写用例的输入盲区并靠反例缩小定位真实缺陷,用 pytest-benchmark 把性能退化成一道可对比的门禁,用 pytest-cov 的覆盖率与 --cov-fail-under 卡住底线。
单元测试之外的第二层防线:先划清单元与集成的边界,再用 SQLite + fixture 在本机搭出可跑的等价数据层,讲透外层事务加 SAVEPOINT 的用例隔离,最后给出 testcontainers 真实容器环境的配置并明确标注未实测。
把 pytest 从「能跑」推到「可维护」:conftest.py 向上合并与就近覆盖、fixture 作用域与依赖注入、工厂型 fixture 避免共享可变状态,再把约定写进 pyproject.toml,最后用一个本地 conftest 插件和实测插件清单收尾。
本节把 TaskAPI 的 add、list、toggle 抽成真正的函数:先讲函数签名与多返回值为何是 Go 的错误传递方式,再讲命名返回值、可变参数与闭包;随后重点拆解 defer 的 LIFO 顺序和「参数立即求值」这一最容易踩的坑,最后用三个函数重写命令派发器并实测运行。