<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Go 进阶教程导航：151 篇覆盖版本特性、并发、性能与工程实践的主题索引 on PlumePHP</title><link>https://plumephp.com/posts/golang/tutors/</link><description>Recent content in Go 进阶教程导航：151 篇覆盖版本特性、并发、性能与工程实践的主题索引 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Thu, 18 Dec 2025 10:16:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/posts/golang/tutors/index.xml" rel="self" type="application/rss+xml"/><item><title>Go 2025 入门专题目录：从能写小程序到能维护小服务</title><link>https://plumephp.com/go-2025-beginner-learning-path/</link><pubDate>Thu, 18 Dec 2025 10:16:00 +0800</pubDate><guid>https://plumephp.com/go-2025-beginner-learning-path/</guid><description>整理 2025 年 Go 入门专题文章，按基础工具、HTTP、数据处理、并发、测试、安全网络和运维观测给出阅读路径。</description></item><item><title>Go 入门：用 text/template 生成一份朴素报表</title><link>https://plumephp.com/go-text-template-reports-2025/</link><pubDate>Fri, 05 Dec 2025 17:21:00 +0800</pubDate><guid>https://plumephp.com/go-text-template-reports-2025/</guid><description>不是所有输出都需要 HTML。很多内部工具会生成纯文本日报、邮件正文、Markdown 摘要、配置片段或工单说明。直接用 拼字符串可以起步，但字段一多，换行和缩进就会变得难维护。Go 标准库的 很适合这类场景。</description></item><item><title>Go 入门：WaitGroup 不只等待，还要收好结果</title><link>https://plumephp.com/go-waitgroup-result-collection-2025/</link><pubDate>Thu, 13 Nov 2025 09:49:00 +0800</pubDate><guid>https://plumephp.com/go-waitgroup-result-collection-2025/</guid><description>sync.WaitGroup 是 Go 并发入门必学工具。它的职责很简单：等一组 goroutine 做完。但真实代码里，等待只是第一步。你还要拿到每个任务的结果、处理错误、控制并发数量，并保证 channel 正确关闭。很多初学者会写出“能等完，但结果偶尔丢失或死锁”的代码。</description></item><item><title>Go 并发 map 入门：mutex、sync.Map 和单 goroutine 管理</title><link>https://plumephp.com/go-concurrent-map-patterns-2025/</link><pubDate>Tue, 28 Oct 2025 17:33:00 +0800</pubDate><guid>https://plumephp.com/go-concurrent-map-patterns-2025/</guid><description>Go 的 map 很好用，但普通 map 不是并发安全的。多个 goroutine 同时读写同一个 map，可能触发 fatal error，也可能产生数据竞争。初学者常常在 HTTP handler、缓存、在线用户列表里踩到这个问题。</description></item><item><title>Go 领域错误入门：errors.Is 和 errors.As 如何服务业务判断</title><link>https://plumephp.com/go-domain-errors-is-as-2025/</link><pubDate>Tue, 07 Oct 2025 11:47:00 +0800</pubDate><guid>https://plumephp.com/go-domain-errors-is-as-2025/</guid><description>Go 的 error 很简单，但业务系统里的错误并不简单：订单不存在、库存不足、余额不够、状态不允许、外部支付超时。这些错误需要被上层判断，映射成 HTTP 状态码、用户提示、重试策略。只靠字符串比较会非常脆弱。</description></item><item><title>Go TLS 客户端证书入门：什么时候需要 mTLS</title><link>https://plumephp.com/go-tls-client-cert-basics-2025/</link><pubDate>Thu, 25 Sep 2025 10:26:00 +0800</pubDate><guid>https://plumephp.com/go-tls-client-cert-basics-2025/</guid><description>普通 HTTPS 里，客户端验证服务器证书，确认自己连的是正确服务。mTLS，也就是双向 TLS，还要求客户端提供证书，服务器也验证客户端身份。内部服务调用、企业网关、支付接口、某些高安全 API 都可能要求客户端证书。</description></item><item><title>Go 入门：用 net/netip 处理 IP 地址更省心</title><link>https://plumephp.com/go-netip-address-basics-2025/</link><pubDate>Wed, 24 Sep 2025 15:33:00 +0800</pubDate><guid>https://plumephp.com/go-netip-address-basics-2025/</guid><description>介绍 net/netip 的 Addr 和 Prefix，讲解 IP 解析、私网判断、CIDR 匹配、HTTP 客户端 IP 的边界。</description></item><item><title>Go embed 模板布局入门：base、partial 和页面模板怎么组织</title><link>https://plumephp.com/go-embed-template-layouts-2025/</link><pubDate>Tue, 09 Sep 2025 15:18:00 +0800</pubDate><guid>https://plumephp.com/go-embed-template-layouts-2025/</guid><description>用一个小型后台页面讲 Go html/template、embed.FS、base layout、partial 和模板测试的组织方式。</description></item><item><title>Go 内存限制入门：GOMEMLIMIT、GOGC 和容器里的服务</title><link>https://plumephp.com/go-memory-limit-gogc-2025/</link><pubDate>Thu, 21 Aug 2025 10:36:00 +0800</pubDate><guid>https://plumephp.com/go-memory-limit-gogc-2025/</guid><description>Go 有自动垃圾回收，但这不表示内存可以不管。容器里部署服务时，如果内存持续上涨，最终可能被 OOM kill。初学者常见误解是：只要没有内存泄漏，Go 会自动处理。现实是，GC 有策略，程序有峰值，容器有上限，你需要知道基本参数。</description></item><item><title>Go expvar 入门：给小服务加几个轻量指标</title><link>https://plumephp.com/go-expvar-metrics-basics-2025/</link><pubDate>Wed, 20 Aug 2025 15:27:00 +0800</pubDate><guid>https://plumephp.com/go-expvar-metrics-basics-2025/</guid><description>很多小服务一开始没有完整监控系统，但也需要知道一些基本状态：请求数、错误数、队列长度、缓存命中次数。Go 标准库里的 可以用很低成本暴露 JSON 指标。它不替代 Prometheus 这类监控体系，但很适合入门理解“服务应该给外界看哪些状态”。</description></item><item><title>Go 1.18 any 与 interface{} 深度对比：类型别名背后的演进与最佳实践</title><link>https://plumephp.com/go-118-any-vs-interface-2022/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-118-any-vs-interface-2022/</guid><description>Go 1.18 引入 any 作为 interface{} 的预声明别名，本文深入剖析二者的编译器等价性、使用场景对比、迁移策略、与泛型的协同关系，以及空接口 nil 陷阱与类型系统演进趋势，帮助开发者做出正确的选择。</description></item><item><title>Go 1.18 泛型初体验：先从三个小函数开始理解</title><link>https://plumephp.com/go-118-generics-first-look-2022/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-118-generics-first-look-2022/</guid><description>本文从 Contains、Map 和泛型 Set 三个小例子出发，详解 Go 1.18 泛型的类型参数、约束和适用边界，帮助初学者建立正确理解。</description></item><item><title>Go 1.20 多错误处理入门：errors.Join 怎么用才自然</title><link>https://plumephp.com/go-120-errors-join-2023/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-120-errors-join-2023/</guid><description>本文详解 Go 1.20 errors.Join 的使用场景和方法，通过批量校验、资源关闭和并发任务实例说明多错误保留的价值，附带测试策略。</description></item><item><title>Go 1.21 工具链管理入门：go.mod 里的 go 和 toolchain 怎么理解</title><link>https://plumephp.com/go-121-toolchain-management-2023/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-121-toolchain-management-2023/</guid><description>本文详解 Go 1.21 前后 go.mod 中 go 版本和 toolchain 指令的含义，帮助理解项目工具链、语言版本和团队协作中的版本管理。</description></item><item><title>Go atomic 包深度使用指南：从原子计数到无锁编程的完整实践</title><link>https://plumephp.com/go-atomic-basics-2022/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-atomic-basics-2022/</guid><description>深入讲解 Go sync/atomic 包的完整使用方式，涵盖 atomic.Value、atomic.Int32、Int64 等类型化原子操作、CAS 原理、内存序、与 mutex 的性能对比基准测试、无锁计数器实现、配置热更新应用，以及 ABA 问题与使用边界。</description></item><item><title>Go bufio 包完全实战指南：逐行扫描、缓冲读写与流式处理优化</title><link>https://plumephp.com/go-bufio-scanner-reader/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-bufio-scanner-reader/</guid><description>深入讲解 Go bufio 包的 Reader、Writer 缓冲原理，Scanner 分词机制与自定义 SplitFunc，大文件逐行读取优化策略，HTTP 响应体读取优化，CSV 和 JSON 流式解析中的 bufio 应用，Flush 策略与内存分配优化。</description></item><item><title>Go build tags 入门：为不同环境编译不同文件</title><link>https://plumephp.com/go-build-tags-environments-2025/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-build-tags-environments-2025/</guid><description>本文详解 Go build tags 的使用方法，涵盖平台差异、集成测试隔离和编译期功能选择，附带文件命名规范和生产环境使用建议。</description></item><item><title>Go context 值入门：请求范围数据可以放，业务参数不要乱塞</title><link>https://plumephp.com/go-context-values-boundary-2025/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-context-values-boundary-2025/</guid><description>本文详解 context.WithValue 的适用边界和使用规范，明确请求 ID、用户 ID 等横切信息可以放，而业务参数和依赖对象不该通过 context 传递。</description></item><item><title>Go Context 取消原因深度解析：从 WithCancelCause 到梯度超时设计</title><link>https://plumephp.com/go-context-cancellation-cause-2024/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-context-cancellation-cause-2024/</guid><description>深度解析 Go Context 的取消与原因传递机制，涵盖 WithCancelCause 源码分析、CancelCauseFunc 使用、WithoutCancel 与 AfterFunc 新特性、梯度超时设计及 context 泄漏调试方法。</description></item><item><title>Go embed 入门：把模板和静态文件打进二进制</title><link>https://plumephp.com/go-embed-static-assets-2023/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-embed-static-assets-2023/</guid><description>本文详解 Go embed 编译时嵌入文件的能力，涵盖单文件、目录、模板和静态资源服务，附带安全性、开发体验和部署实践。</description></item><item><title>Go Fuzz 测试 2024 完全指南：从语法到实战的模糊测试体系</title><link>https://plumephp.com/go-fuzz-testing-introduction-2024/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-fuzz-testing-introduction-2024/</guid><description>系统讲解 Go 内置 Fuzz 测试的完整使用方法，涵盖 go test -fuzz 语法、语料库管理、fuzzer 架构、生成器函数编写、覆盖率引导、崩溃复现与最小化、CI 集成策略，以及在 API 解析器和编解码器中的实战应用。</description></item><item><title>Go Fuzzing 基础工作流完整教程：从第一个 Fuzz 函数到 CI 持续集成</title><link>https://plumephp.com/go-fuzzing-basic-workflow-2022/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-fuzzing-basic-workflow-2022/</guid><description>从编写第一个 fuzz 函数开始，系统讲解种子语料库准备、运行与监控、崩溃发现与分析、回归测试编写，以及与 CI/CD 的持续集成策略，涵盖不同类型输入的 fuzzing 方法。</description></item><item><title>Go HTTP 中间件入门：日志、恢复、鉴权和请求 ID 怎么串起来</title><link>https://plumephp.com/go-http-middleware-patterns-2024/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-http-middleware-patterns-2024/</guid><description>本文详解 Go HTTP 中间件的设计模式与实现，包含请求 ID、panic 恢复、鉴权、日志等实战中间件，附带中间件链组合和常见陷阱。</description></item><item><title>Go HTTP 客户端中间件入门：给外部调用加日志、重试和请求 ID</title><link>https://plumephp.com/go-http-client-middleware-2023/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-http-client-middleware-2023/</guid><description>本文详解 Go HTTP 客户端通过 RoundTripper 实现中间件的方法，涵盖日志记录、请求头注入和有限重试策略，附带组合顺序和最佳实践。</description></item><item><title>Go io.Reader 与 io.Writer 实战完全指南：从设计哲学到流式处理</title><link>https://plumephp.com/go-io-reader-writer-practical-guide/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-io-reader-writer-practical-guide/</guid><description>从 io 接口设计哲学出发，深入剖析 bytes.Buffer、strings.Reader、os.File 实现，详解 io.Copy、TeeReader、MultiReader 等装饰器模式，涵盖自定义 Reader 和 Writer 实现、流式处理大文件、网络流、gzip 压缩流及 bufio 缓冲原理，构建完整的 IO 知识体系。</description></item><item><title>Go netip 入门：更清楚地处理 IP 地址和网段</title><link>https://plumephp.com/go-118-netip-introduction-2022/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-118-netip-introduction-2022/</guid><description>本文详解 Go 1.18 引入的 net/netip 包，涵盖 IP 解析、网段判断、白名单实现、IPv6 处理等场景，对比传统 net.IP 的优缺点并提供实战示例。</description></item><item><title>Go pprof 入门：给 HTTP 服务找 CPU 和内存热点</title><link>https://plumephp.com/go-pprof-http-service-2023/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-pprof-http-service-2023/</guid><description>本文详解 Go pprof 在 HTTP 服务中的使用方法，包含 CPU 和内存分析、goroutine 排查、pprof 安全实践和性能优化方法论。</description></item><item><title>Go regexp 包实战完全指南：正则语法、性能优化与常见模式</title><link>https://plumephp.com/go-regexp-practical-guide/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-regexp-practical-guide/</guid><description>全面讲解 Go regexp 包的实战用法，涵盖正则语法速查、Compile/Parse 底层实现、完整 API 使用、性能优化策略、常见正则模式与 strings 包性能对比选择策略。</description></item><item><title>Go ServeMux 路由入门：用标准库写更清楚的 HTTP 路由</title><link>https://plumephp.com/go-servemux-routing-2024/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-servemux-routing-2024/</guid><description>本文详解 Go 标准库 ServeMux 的现代用法，涵盖方法路由、路径参数、handler 组织和 JSON API 响应，对比框架与标准库的选择策略。</description></item><item><title>Go slices 和 maps 包入门：少写一点重复集合代码</title><link>https://plumephp.com/go-slices-maps-packages-2024/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-slices-maps-packages-2024/</guid><description>本文详解 Go 标准库 slices 和 maps 包的常用函数，涵盖克隆、查找、排序、删除等操作，对比手写循环与标准库的效率差异并给出实战选型建议。</description></item><item><title>Go slog 入门：用结构化日志记录更清楚的服务行为</title><link>https://plumephp.com/go-slog-structured-logging-2024/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-slog-structured-logging-2024/</guid><description>本文详解 Go 标准库 log/slog 的基本用法，包含文本与 JSON 格式、With 字段传递、HTTP 请求日志中间件、敏感信息处理和生产环境最佳实践。</description></item><item><title>Go TLS/HTTPS 客户端安全完全指南：证书验证、双向认证与 TLS 1.3</title><link>https://plumephp.com/go-security-tls-http-client-2022/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-security-tls-http-client-2022/</guid><description>深入讲解 Go crypto/tls 配置的方方面面，涵盖 InsecureSkipVerify 的危险性、客户端证书双向认证、自定义 CA 证书池、证书固定技术、TLS 1.3 支持、HTTP Client Transport TLS 配置，以及常见 TLS 配置错误与安全漏洞防范。</description></item><item><title>Go Worker 队列入门：用 channel 和 context 处理后台任务</title><link>https://plumephp.com/go-worker-queue-basics-2023/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-worker-queue-basics-2023/</guid><description>本文详解 Go 中使用 channel、goroutine、WaitGroup 和 context 实现 Worker 队列的方法，附带重试、观测和队列边界说明。</description></item><item><title>Go 依赖管理入门：go mod、版本号、replace 和 tidy 怎么用</title><link>https://plumephp.com/go-mod-dependency-management/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-mod-dependency-management/</guid><description>本文详解 Go Modules 的依赖管理方法，涵盖 go.mod/go.sum 维护、版本选择、replace 调试和 v2+ 模块路径规则，附带团队协作和常见排错指南。</description></item><item><title>Go 分页 API 设计与实现：Offset、Cursor、稳定排序与性能对比</title><link>https://plumephp.com/go-pagination-api-2024/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-pagination-api-2024/</guid><description>深入讲解 Go 分页 API 的完整设计与实现，涵盖 Offset 与 Cursor 两种方案的原理、适用场景、性能对比及实战代码，帮助你构建高性能、高稳定的列表接口。</description></item><item><title>Go 压缩和归档入门：gzip、tar 和 zip 的基本用法与实战</title><link>https://plumephp.com/go-compress-archive-basics/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-compress-archive-basics/</guid><description>本文详解 Go 标准库中 compress/gzip、archive/tar 和 archive/zip 的使用方式，涵盖日志压缩、文件打包、HTTP 响应流式输出等实战场景，附带性能对比和常见错误排查。</description></item><item><title>Go 后台任务重试入门：失败后怎么重试才不添乱</title><link>https://plumephp.com/go-background-job-retry-2025/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-background-job-retry-2025/</guid><description>本文详解后台任务重试的设计方法，涵盖最大次数、退避等待、错误分类、幂等性、死信队列和可观察性，附带最佳实践和常见陷阱。</description></item><item><title>Go 密码哈希完整安全指南：bcrypt、Argon2、盐值与时序攻击防范</title><link>https://plumephp.com/go-password-hashing-basics/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-password-hashing-basics/</guid><description>深入对比 bcrypt、argon2、scrypt 和 pbkdf2 四种密码哈希算法，讲解 Go 中各算法的使用方法、盐值与 pepper 原理、密码验证流程、时序攻击防范技术、密码策略与会话管理，以及 OAuth2/OIDC 替代方案。</description></item><item><title>Go 工作区 2024 最新实践：go.work 完整语法与 monorepo 实战</title><link>https://plumephp.com/go-workspaces-go-work-2024/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-workspaces-go-work-2024/</guid><description>全面讲解 Go 工作区 2024 最新实践，涵盖 go.work 完整语法参考、多版本模块联调、go work sync 依赖同步、CI 集成策略、工作区限制与注意事项，以及构建 API+SDK+CLI monorepo 的实战方案。</description></item><item><title>Go 工作区深度使用指南：go work 解决本地多模块联调与工程化实践</title><link>https://plumephp.com/go-workspaces-practical-start-2022/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-workspaces-practical-start-2022/</guid><description>深度讲解 Go 1.18 工作区机制，涵盖 go.work 完整语法、use 与 replace 的区别、多模块本地联调实战、CI/CD 中工作区策略、monorepo 工作区管理与常见问题排查。</description></item><item><title>Go 工作目录入门：为什么本地能读到文件，部署后却找不到</title><link>https://plumephp.com/go-working-directory-paths-2025/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-working-directory-paths-2025/</guid><description>本文详解 Go 程序中工作目录、相对路径和 embed 的使用方法，附带部署环境路径问题和测试最佳实践。</description></item><item><title>Go 微服务可观测性三支柱实战：Metrics、Logs 与 Traces 完整建设指南</title><link>https://plumephp.com/go-small-service-observability-2022/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-small-service-observability-2022/</guid><description>系统讲解 Go 微服务的可观测性三支柱建设，涵盖 Prometheus 指标设计、结构化日志实践、OpenTelemetry 链路追踪、健康检查、Grafana 看板配置与告警规则设计，提供渐进式建设路径。</description></item><item><title>Go 性能入门：基准测试、pprof 和先测量再优化</title><link>https://plumephp.com/go-benchmark-and-profiling-basics/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-benchmark-and-profiling-basics/</guid><description>本文详解 Go 基准测试和性能分析方法，包含 Benchmark 编写、benchstat 对比、pprof CPU 和内存分析，附带性能优化常见误区与最佳实践。</description></item><item><title>Go 排序与搜索集合完全指南：sort 包、container 包与泛型 slices 对比</title><link>https://plumephp.com/go-sort-search-and-collections/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-sort-search-and-collections/</guid><description>全面讲解 Go sort 包的排序与搜索能力，深入 sort.Slice、SliceStable、Search 的使用，详解 container/heap、list、ring 的实现与应用场景，对比 Go 1.21+ 泛型 slices 包的 Sort、SortFunc 新特性。</description></item><item><title>Go 数据库 NULL 值入门：sql.NullString、指针和业务语义</title><link>https://plumephp.com/go-database-null-values-2023/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-database-null-values-2023/</guid><description>本文详解 Go database/sql 中 NULL 值的处理方式，包括 sql.NullString、sql.NullTime、指针字段和 JSON 响应转换，附带测试策略和常见错误。</description></item><item><title>Go 数据库迁移入门：SQL 文件、版本表和上线顺序</title><link>https://plumephp.com/go-database-migrations-basics-2025/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-database-migrations-basics-2025/</guid><description>本文详解数据库迁移的基本概念和实践方法，涵盖迁移文件组织、版本表、幂等性、应用兼容和分批回填策略，附带上线流程建议。</description></item><item><title>Go 构建标志与环境变量完全指南：ldflags、交叉编译与可复现构建</title><link>https://plumephp.com/go-build-flags-and-environments/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-build-flags-and-environments/</guid><description>全面讲解 Go 构建标志与环境变量，涵盖 ldflags 注入版本信息、tags 条件编译、CGO_ENABLED 控制、GOOS/GOARCH 交叉编译、编译缓存管理、可复现构建与 Docker 多阶段构建实践。</description></item><item><title>Go 泛型之前怎么复用代码：接口、函数参数和清楚的重复</title><link>https://plumephp.com/go-reuse-before-generics/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-reuse-before-generics/</guid><description>本文回顾 Go 1.18 泛型出现前的代码复用方式，涵盖接口表达行为、函数参数注入策略和 interface{} 的边界使用，帮助理解泛型引入的设计背景。</description></item><item><title>Go 测试覆盖率入门：数字之外更重要的是关键路径</title><link>https://plumephp.com/go-coverage-practical-guide-2023/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-coverage-practical-guide-2023/</guid><description>本文详解 Go 测试覆盖率工具的使用方法，包含覆盖率命令、HTML 报告解读和关键路径测试策略，附带常见误区和改进建议。</description></item><item><title>Go 空接口与类型断言深度解析：从 interface{} 内存布局到泛型替代趋势</title><link>https://plumephp.com/go-empty-interface-and-type-assertions/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-empty-interface-and-type-assertions/</guid><description>深度解析 Go 空接口的内存布局、类型断言 .(T) 与 .(T,ok) 的性能差异、type switch 完整用法、反射替代方案、接口 nil 陷阱以及泛型对空接口的替代趋势。</description></item><item><title>Go 竞态检测入门：用 -race 找出并发读写问题</title><link>https://plumephp.com/go-race-detector-practice-2023/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-race-detector-practice-2023/</guid><description>本文详解 Go race detector 的使用方法和原理，通过计数器、map 并发写入和 HTTP 指标等示例说明如何发现并修复数据竞争问题。</description></item><item><title>Go 表单解析入门：FormValue、ParseForm 和 PostForm 怎么选</title><link>https://plumephp.com/go-http-form-parsing-2025/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-http-form-parsing-2025/</guid><description>本文详解 Go HTTP 表单解析的 API 选择和使用方法，涵盖 GET query、POST 表单、multipart 上传和大小限制，附带校验和测试策略。</description></item><item><title>Go 调试完整工具链指南：从 fmt.Println 到 Delve 与 pprof 深度分析</title><link>https://plumephp.com/go-debugging-common-tools/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-debugging-common-tools/</guid><description>系统讲解 Go 调试的完整工具链，涵盖基础打印输出、go test 最小复现、race detector 并发检测、Delve 深度调试、pprof 火焰图分析、结构化日志定位与远程调试实战，帮助开发者建立科学的调试思维和方法论。</description></item><item><title>Go 跨平台路径处理完全指南：filepath、embed 与路径安全实践</title><link>https://plumephp.com/go-cross-platform-paths/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-cross-platform-paths/</guid><description>全面讲解 Go 跨平台路径处理方案，涵盖 path 与 path/filepath 对比、Windows/Unix 路径差异、filepath 核心 API 原理、embed 资源路径处理、Docker 容器路径映射与路径遍历攻击防范。</description></item><item><title>Go 轻量分层入门：Handler、Service、Store 怎么刚刚好</title><link>https://plumephp.com/go-clean-architecture-lightweight-2024/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-clean-architecture-lightweight-2024/</guid><description>本文用任务 API 示例讲解 Go 项目中轻量分层架构的设计方法，说明 Handler、Service、Store 的职责边界，附带接口测试和避免过度设计的最佳实践。</description></item><item><title>Go 配置校验入门：让服务启动时就发现问题</title><link>https://plumephp.com/go-config-validation-2023/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-config-validation-2023/</guid><description>本文详解 Go 服务配置加载和校验的最佳实践，包含环境变量读取、必填项校验、URL 验证和启动时配置摘要打印，附带测试策略。</description></item><item><title>Go 随机数入门：math/rand、crypto/rand 和安全 Token</title><link>https://plumephp.com/go-random-numbers-and-tokens/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-random-numbers-and-tokens/</guid><description>本文详解 Go 中 math/rand 和 crypto/rand 的区别与用法，覆盖测试随机数生成、业务抽样、安全 Token、验证码等场景，附带常见错误与最佳实践。</description></item><item><title>Go 静态文件处理全历史演进：从 go-bindata 到 embed 完全指南</title><link>https://plumephp.com/go-static-files-before-embed/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-static-files-before-embed/</guid><description>全面讲解 Go 静态文件处理的历史演进，涵盖 embed 之前的方案对比、Go 1.16 embed 包源码解析、embed FS 只读特性、性能对比、前端 SPA 嵌入方案与模板嵌入热重载策略。</description></item><item><title>Go 项目发布与上线完整清单：从代码冻结到生产验证的系统性流程</title><link>https://plumephp.com/go-release-checklist-for-beginners-2024/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-release-checklist-for-beginners-2024/</guid><description>系统梳理 Go 项目发布全流程，涵盖语义化版本规范、go mod tidy 验证、单元与集成测试、安全扫描、性能回归测试、构建签名、CHANGELOG 编写、Docker 镜像构建、CI/CD 检查、上线监控与回滚计划，帮助团队建立可靠的发布管理体系。</description></item><item><title>Go泛型集合实战：手写Set、Stack、Queue与迭代器</title><link>https://plumephp.com/go-generic-set-stack-2024/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/go-generic-set-stack-2024/</guid><description>通过Set、Stack、Queue三个泛型集合深入理解Go泛型约束、迭代器模式与性能优化，包含完整可运行代码与并发安全版本</description></item><item><title>Go 入门：随机数别乱用，Token 要用 crypto/rand</title><link>https://plumephp.com/go-random-token-crypto-rand-2025/</link><pubDate>Wed, 06 Aug 2025 13:12:00 +0800</pubDate><guid>https://plumephp.com/go-random-token-crypto-rand-2025/</guid><description>随机数是入门时很容易被低估的主题。math/rand 适合模拟和非安全场景，crypto/rand 才适合 Session、验证码、重置链接等安全场景。本文讲解两类随机数的正确使用和 Token 安全设计。</description></item><item><title>Go 入门：用 slog 写可检索的结构化日志</title><link>https://plumephp.com/go-slog-structured-logging-2025/</link><pubDate>Mon, 28 Jul 2025 08:54:00 +0800</pubDate><guid>https://plumephp.com/go-slog-structured-logging-2025/</guid><description>日志不是程序最后随手加的一行 。线上排查问题时，日志经常是第一证据：哪个用户触发了请求、参数是什么、调用下游花了多久、错误发生在哪一层。纯文本日志能看，但不方便检索。结构化日志把关键信息放到字段里，日志平台可以按字段过滤、聚合和统计。</description></item><item><title>Go fs.FS 入门：让文件读取逻辑更容易测试</title><link>https://plumephp.com/go-fs-fs-testing-2025/</link><pubDate>Wed, 23 Jul 2025 08:39:00 +0800</pubDate><guid>https://plumephp.com/go-fs-fs-testing-2025/</guid><description>用配置文件读取示例讲 io/fs.FS 的基本用法，展示 os.DirFS、fstest.MapFS、embed.FS 和测试边界。</description></item><item><title>Go 文件变化轮询入门：不用依赖也能做简单热加载</title><link>https://plumephp.com/go-file-watcher-polling-2025/</link><pubDate>Tue, 15 Jul 2025 16:29:00 +0800</pubDate><guid>https://plumephp.com/go-file-watcher-polling-2025/</guid><description>监听文件变化常见做法是使用 fsnotify 这类库。但有些小工具不想引入依赖，只需要每隔几秒检查配置文件是否变了。这时轮询修改时间是一个简单可控的方案。它不够实时，但容易理解，也适合入门。本文用配置热加载示例讲如何轮询文件变化，以及它的边界。</description></item><item><title>Go JSON 请求校验入门：不用框架也能写清楚规则</title><link>https://plumephp.com/go-json-schema-lite-validation-2025/</link><pubDate>Thu, 19 Jun 2025 19:40:00 +0800</pubDate><guid>https://plumephp.com/go-json-schema-lite-validation-2025/</guid><description>写 JSON API 时，校验是绕不开的。字段缺失、字符串太长、枚举值不合法、嵌套数组为空，这些都应该在进入业务逻辑前拦住。很多项目会使用校验库，这没问题；但初学者最好先理解不用框架时规则应该放在哪里、错误怎么组织。</description></item><item><title>Go 入门：用 time.Ticker 做一个朴素限速器</title><link>https://plumephp.com/go-rate-limiter-ticker-2025/</link><pubDate>Wed, 18 Jun 2025 11:27:00 +0800</pubDate><guid>https://plumephp.com/go-rate-limiter-ticker-2025/</guid><description>限速听起来像网关和高并发系统才需要的能力，其实入门项目也经常遇到。比如你要批量同步 5000 个客户资料到第三方 CRM，对方文档写着每秒最多 5 次请求。如果你开 50 个 goroutine 一口气打过去，很快就会收到 429，严重时还会被封禁。</description></item><item><title>Go os/exec 入门：调用外部命令时如何处理超时和输出</title><link>https://plumephp.com/go-os-exec-command-2025/</link><pubDate>Wed, 11 Jun 2025 13:48:00 +0800</pubDate><guid>https://plumephp.com/go-os-exec-command-2025/</guid><description>用图片转换命令示例讲 os/exec 的基本用法，包括 CommandContext、stdout/stderr、参数传递和安全边界。</description></item><item><title>Go TestMain 入门：为一组测试准备共享环境</title><link>https://plumephp.com/go-testmain-fixtures-2025/</link><pubDate>Tue, 03 Jun 2025 10:44:00 +0800</pubDate><guid>https://plumephp.com/go-testmain-fixtures-2025/</guid><description>大多数 Go 测试只需要普通 TestXxx，但有时一个包里的多组测试需要共享准备工作，比如创建临时目录、启动测试服务器、准备测试数据库连接。TestMain 可以在一个测试包运行前后执行统一逻辑。本文讲 TestMain 的基本结构和边界。它有用，但不要滥用。很多测试用 t.TempDir、helper 和子测试就够了。</description></item><item><title>Go net/url 入门：安全地拼 URL 和查询参数</title><link>https://plumephp.com/go-net-url-query-2025/</link><pubDate>Tue, 27 May 2025 11:16:00 +0800</pubDate><guid>https://plumephp.com/go-net-url-query-2025/</guid><description>很多 HTTP 客户端 bug 都来自手写 URL。Go 标准库的 net/url 可以安全处理路径和查询参数，本文讲解 url.Values、PathEscape、ResolveReference 和常见安全误区。</description></item><item><title>Go worker 取消入门：后台循环如何听懂 context</title><link>https://plumephp.com/go-worker-context-cancel-2025/</link><pubDate>Fri, 09 May 2025 13:37:00 +0800</pubDate><guid>https://plumephp.com/go-worker-context-cancel-2025/</guid><description>用消息消费 worker 示例讲 context 取消、select 循环、任务超时、资源关闭和测试后台 goroutine 退出。</description></item><item><title>Go 入门：regexp 能做什么，不能替你做什么</title><link>https://plumephp.com/go-regexp-input-cleaning-2025/</link><pubDate>Tue, 29 Apr 2025 16:05:00 +0800</pubDate><guid>https://plumephp.com/go-regexp-input-cleaning-2025/</guid><description>正则表达式很容易让人又爱又怕。Go regexp 包使用 RE2 语法，适合做格式匹配、简单提取和文本替换。本文讲解预编译、分组提取、性能优化和常见误区。</description></item><item><title>Go HTTP 客户端上传文件入门：multipart 请求怎么构造</title><link>https://plumephp.com/go-http-client-multipart-upload-2025/</link><pubDate>Tue, 22 Apr 2025 14:05:00 +0800</pubDate><guid>https://plumephp.com/go-http-client-multipart-upload-2025/</guid><description>用头像上传客户端示例讲 Go 如何构造 multipart/form-data 请求，包含文件字段、普通字段、Content-Type 和测试。</description></item><item><title>Go HTTP 服务优雅关闭入门：停止接新请求，等旧请求收尾</title><link>https://plumephp.com/go-http-server-shutdown-drain-2025/</link><pubDate>Fri, 18 Apr 2025 08:42:00 +0800</pubDate><guid>https://plumephp.com/go-http-server-shutdown-drain-2025/</guid><description>HTTP 服务发布或重启时，如果直接杀进程，正在处理的请求可能被中断，用户看到连接错误，后台写入也可能只完成一半。Go 的 可以帮助服务优雅关闭：停止接收新连接，等待已有请求完成，直到超时。本文用一个标准 HTTP 服务讲关闭流程、信号处理和常见边界。</description></item><item><title>Go atomic 计数入门：比 mutex 更适合简单计数的场景</title><link>https://plumephp.com/go-atomic-counters-2025/</link><pubDate>Wed, 09 Apr 2025 15:44:00 +0800</pubDate><guid>https://plumephp.com/go-atomic-counters-2025/</guid><description>用请求计数和开关状态示例讲 Go sync/atomic 的基本类型、Add、Load、Store，以及 atomic 不适合复杂状态的边界。</description></item><item><title>Go SQL 预编译入门：PrepareContext 什么时候值得用</title><link>https://plumephp.com/go-sql-prepared-statements-2025/</link><pubDate>Thu, 27 Mar 2025 14:26:00 +0800</pubDate><guid>https://plumephp.com/go-sql-prepared-statements-2025/</guid><description>用批量插入任务示例讲 database/sql 中 PrepareContext、Stmt、参数绑定、关闭资源和与普通 ExecContext 的取舍。</description></item><item><title>Go sync.Pool 入门：复用临时对象前先看清边界</title><link>https://plumephp.com/go-sync-pool-buffers-2025/</link><pubDate>Wed, 19 Mar 2025 09:22:00 +0800</pubDate><guid>https://plumephp.com/go-sync-pool-buffers-2025/</guid><description>经常出现在性能优化文章里。它可以复用临时对象，减少分配压力。比如高频请求里不断创建 ，可以考虑用 pool 复用。但 也很容易被滥用：代码复杂了，性能却没明显提升，甚至因为对象没清理干净引入 bug。</description></item><item><title>Go 入门：CSV 导入导出别只会 strings.Split</title><link>https://plumephp.com/go-csv-reading-writing-2025/</link><pubDate>Wed, 12 Mar 2025 10:42:00 +0800</pubDate><guid>https://plumephp.com/go-csv-reading-writing-2025/</guid><description>CSV 是最不起眼、也最容易出事故的数据格式。运营同事从后台导出一份表，财务系统给你一份结算明细，供应商发来一批商品编码，很多时候都是 CSV。初学者常犯的错误是用 处理。只要字段里出现逗号、换行或双引号，这个办法马上失效。</description></item><item><title>Go HTTP gzip 压缩入门：什么时候压缩响应，什么时候不要压</title><link>https://plumephp.com/go-http-gzip-middleware-2025/</link><pubDate>Mon, 24 Feb 2025 18:05:00 +0800</pubDate><guid>https://plumephp.com/go-http-gzip-middleware-2025/</guid><description>用 HTTP 中间件示例讲 Go 服务里的 gzip 响应压缩，包括 Accept-Encoding、Content-Encoding、小响应跳过和测试。</description></item><item><title>Go JSON 流式响应入门：边查边写，避免一次性占满内存</title><link>https://plumephp.com/go-json-stream-response-2025/</link><pubDate>Tue, 18 Feb 2025 09:51:00 +0800</pubDate><guid>https://plumephp.com/go-json-stream-response-2025/</guid><description>很多列表接口一开始会把所有数据查出来，放进切片，再 。数据少时没问题，数据一多，内存会飙升，用户也要等全部数据准备好才能收到响应。对于导出类接口，可以考虑流式 JSON 响应：边查、边编码、边写给客户端。</description></item><item><title>Go sync.Once 入门：懒加载资源时只初始化一次</title><link>https://plumephp.com/go-sync-once-lazy-init-2025/</link><pubDate>Mon, 10 Feb 2025 16:18:00 +0800</pubDate><guid>https://plumephp.com/go-sync-once-lazy-init-2025/</guid><description>Go 服务里经常有一些资源只需要初始化一次：解析模板、加载规则、创建昂贵对象、读取本地配置。你可以在程序启动时全部准备好，也可以第一次使用时再懒加载。懒加载时最怕并发：多个请求同时进来，发现资源还没初始化，于是重复执行。</description></item><item><title>Go 入门：Cookie、Session 和一个简单登录状态</title><link>https://plumephp.com/go-http-cookie-session-basics-2025/</link><pubDate>Fri, 07 Feb 2025 14:18:00 +0800</pubDate><guid>https://plumephp.com/go-http-cookie-session-basics-2025/</guid><description>登录状态是 Web 开发绕不开的话题。很多初学者一听到 Session，就会把它想成某种神秘机制。其实从 HTTP 角度看，Cookie 是浏览器保存并自动带回服务端的一小段数据；Session 是服务端用这段数据找到用户状态的一种做法。Cookie 在客户端，Session 数据通常在服务端。</description></item><item><title>Go http.ServeContent 入门：文件下载、修改时间和断点续传</title><link>https://plumephp.com/go-servecontent-downloads-2025/</link><pubDate>Tue, 28 Jan 2025 10:12:00 +0800</pubDate><guid>https://plumephp.com/go-servecontent-downloads-2025/</guid><description>用报表下载接口讲 http.ServeContent 的基本用法，包括文件名、Content-Type、修改时间、Range 请求和权限检查。</description></item><item><title>Go 入门：用 flag 写一个不慌不忙的命令行配置</title><link>https://plumephp.com/go-cli-flag-config-2025/</link><pubDate>Fri, 24 Jan 2025 09:36:00 +0800</pubDate><guid>https://plumephp.com/go-cli-flag-config-2025/</guid><description>很多人第一次写 Go 程序，是从一个 HTTP 服务开始。但在真实团队里，命令行小工具同样常见：清理过期文件、导入一批 CSV、生成报表、检查接口是否可用。小工具看起来简单，最容易写成“先能跑再说”的样子：路径写死在代码里，超时时间散落在函数里，出了错只打印一行“failed”。等这个工具被同事拿去每天跑，问题就来了。</description></item><item><title>Go httptest.Server 入门：给 HTTP 客户端写可信测试</title><link>https://plumephp.com/go-httptest-server-client-2025/</link><pubDate>Thu, 16 Jan 2025 09:34:00 +0800</pubDate><guid>https://plumephp.com/go-httptest-server-client-2025/</guid><description>很多 Go 初学者会给 HTTP handler 写测试，却不知道怎么给 HTTP 客户端写测试。比如你的服务要调用一个用户中心接口，代码里有 、URL、请求头和 JSON 解码。测试时不可能真的去调用线上用户中心，也不应该为了单元测试启动一整套依赖。标准库里的 提供了一个很实用的工具： 。</description></item><item><title>Go 时区处理入门：time.Location、UTC 和用户本地时间</title><link>https://plumephp.com/go-timezone-location-basics-2025/</link><pubDate>Thu, 09 Jan 2025 11:08:00 +0800</pubDate><guid>https://plumephp.com/go-timezone-location-basics-2025/</guid><description>用预约提醒场景讲 Go 中 UTC 存储、本地时区展示、time.LoadLocation、ParseInLocation 和跨时区测试。</description></item><item><title>Go 配置分层入门：默认值、环境变量和启动校验</title><link>https://plumephp.com/go-env-config-layering-2024/</link><pubDate>Thu, 19 Dec 2024 19:04:00 +0800</pubDate><guid>https://plumephp.com/go-env-config-layering-2024/</guid><description>配置是后端服务里最容易被低估的部分。初学者常常先把端口、数据库地址、超时时间写死在代码里，等部署到不同环境时再匆忙改成环境变量。结果是默认值散落各处，启动时不校验，线上才发现某个配置拼错了。一个清楚的配置系统不一定复杂。</description></item><item><title>Go 测试替身入门：用小接口写出容易测试的业务代码</title><link>https://plumephp.com/go-test-doubles-interfaces-2024/</link><pubDate>Thu, 24 Oct 2024 09:46:00 +0800</pubDate><guid>https://plumephp.com/go-test-doubles-interfaces-2024/</guid><description>很多初学者一听到”单元测试”，就想到 mock 框架。其实 Go 里最常用、最舒服的测试替身，往往只是一个小结构体。你定义一个刚好够用的小接口，测试里手写 fake 或 spy，就能验证业务逻辑，而不用真的发邮件、调支付或连外部 API。</description></item><item><title>Go 日志脱敏入门：不要把密码、Token 和身份证写进日志</title><link>https://plumephp.com/go-log-redaction-basics-2024/</link><pubDate>Thu, 17 Oct 2024 11:28:00 +0800</pubDate><guid>https://plumephp.com/go-log-redaction-basics-2024/</guid><description>日志是排查问题的基础，但日志也很容易泄露敏感信息。密码、验证码、session ID、访问 token、身份证号、银行卡号、完整手机号，如果进入日志系统，就可能被更多人看到，也很难彻底删除。初学者常见错误是为了调试方便，把整个请求体或结构体直接打印出来。</description></item><item><title>Go 黄金文件测试入门：适合输出很长的文本和 JSON</title><link>https://plumephp.com/go-golden-file-tests-2024/</link><pubDate>Tue, 08 Oct 2024 10:12:00 +0800</pubDate><guid>https://plumephp.com/go-golden-file-tests-2024/</guid><description>有些函数的输出很长，比如生成 Markdown、渲染配置文件、格式化 JSON、生成 SQL。你当然可以在测试里写一个很长的字符串常量，但测试文件会变得难读。黄金文件测试，也叫 golden file test，就是把期望输出放在单独文件里，测试时读取文件并比较。</description></item><item><title>Go 部分更新 API 入门：区分未提交、空值和清空字段</title><link>https://plumephp.com/go-json-patch-style-update-2024/</link><pubDate>Thu, 05 Sep 2024 17:19:00 +0800</pubDate><guid>https://plumephp.com/go-json-patch-style-update-2024/</guid><description>Go 普通结构体很难直接区分字段未提交、提交 null 和提交空值。本文用自定义 Optional 类型和 UnmarshalJSON 实现三态区分，讲解 PATCH 接口的安全更新策略。</description></item><item><title>Go 1.23 迭代器入门：range over func 能解决什么问题</title><link>https://plumephp.com/go-iterators-range-over-func-2024/</link><pubDate>Fri, 30 Aug 2024 15:33:00 +0800</pubDate><guid>https://plumephp.com/go-iterators-range-over-func-2024/</guid><description>面向 Go 初学者介绍 Go 1.23 range over func 的基本写法、适用场景、与切片返回的取舍，以及如何避免过度设计。</description></item><item><title>Go 信号处理入门：让 CLI 和服务收到 Ctrl+C 后体面退出</title><link>https://plumephp.com/go-signal-shutdown-cli-2024/</link><pubDate>Wed, 14 Aug 2024 11:09:00 +0800</pubDate><guid>https://plumephp.com/go-signal-shutdown-cli-2024/</guid><description>讲 Go 程序如何使用 signal.NotifyContext 处理 Ctrl+C、优雅停止后台任务、关闭 HTTP 服务和避免资源泄漏。</description></item><item><title>Go 配置热重载入门：哪些配置能重载，哪些不该重载</title><link>https://plumephp.com/go-config-reload-boundary-2024/</link><pubDate>Tue, 06 Aug 2024 09:43:00 +0800</pubDate><guid>https://plumephp.com/go-config-reload-boundary-2024/</guid><description>配置热重载听起来很诱人：不用重启服务，改配置就生效。但不是所有配置都适合热重载。日志级别、开关、限流阈值通常可以；数据库连接地址、监听端口、加密密钥就要谨慎。入门阶段最重要的是先划清边界。本文用一个 JSON 配置文件演示如何安全地加载、校验并用 发布配置，同时说明哪些配置不该随便热重载。</description></item><item><title>Go channel 流水线入门：生产、处理、取消和关闭怎么配合</title><link>https://plumephp.com/go-channel-cancellation-pipeline-2024/</link><pubDate>Mon, 22 Jul 2024 08:49:00 +0800</pubDate><guid>https://plumephp.com/go-channel-cancellation-pipeline-2024/</guid><description>用批量处理任务讲 Go channel 流水线的基础写法，包括生产者、工作者、结果汇总、context 取消和 channel 关闭规则，以及多级流水线、背压控制和超时处理。</description></item><item><title>Go 内存缓存入门：TTL、并发安全和清理策略</title><link>https://plumephp.com/go-inmemory-cache-ttl-2024/</link><pubDate>Tue, 16 Jul 2024 16:07:00 +0800</pubDate><guid>https://plumephp.com/go-inmemory-cache-ttl-2024/</guid><description>不是所有缓存都需要 Redis。很多小型服务只想把低频变化的配置、字典表、权限规则在进程内缓存几分钟，减少数据库查询。Go 里写一个简单内存缓存并不难，但要注意并发安全、过期时间和清理策略。本文写一个带 TTL 的内存缓存。它适合入门理解，不打算替代成熟缓存库。</description></item><item><title>Go 构建版本信息入门：把 commit、版本号和构建时间写进程序</title><link>https://plumephp.com/go-build-version-info-2024/</link><pubDate>Tue, 09 Jul 2024 14:28:00 +0800</pubDate><guid>https://plumephp.com/go-build-version-info-2024/</guid><description>讲 Go 程序如何通过 ldflags 注入版本号、Git commit 和构建时间，并在 CLI 或 HTTP 健康检查中展示。</description></item><item><title>Go 文件上传入门：限制大小、校验类型和安全保存</title><link>https://plumephp.com/go-file-upload-server-2024/</link><pubDate>Tue, 18 Jun 2024 18:26:00 +0800</pubDate><guid>https://plumephp.com/go-file-upload-server-2024/</guid><description>用头像上传接口讲 Go HTTP 文件上传的基本流程，包括 MaxBytesReader、ParseMultipartForm、文件名处理、类型校验和安全保存。</description></item><item><title>Go 邮件模板入门：把验证码和通知邮件渲染清楚</title><link>https://plumephp.com/go-email-template-rendering-2024/</link><pubDate>Mon, 03 Jun 2024 10:31:00 +0800</pubDate><guid>https://plumephp.com/go-email-template-rendering-2024/</guid><description>邮件模板听起来像前端工作，但后端经常要负责生成验证码、邀请链接、账单通知和任务提醒。很多初学项目一开始直接用 拼 HTML，写到第二封邮件时就会变得难维护。Go 的 很适合渲染 HTML 邮件，因为它会自动转义用户数据。</description></item><item><title>Go 密码重置 Token 入门：随机数、过期时间和一次性使用</title><link>https://plumephp.com/go-password-reset-token-2024/</link><pubDate>Tue, 28 May 2024 08:52:00 +0800</pubDate><guid>https://plumephp.com/go-password-reset-token-2024/</guid><description>找回密码看起来是一个普通功能：用户输入邮箱，系统发送链接，用户点开后设置新密码。真正实现时，最关键的是 token。它必须足够随机，不能长期有效，最好一次性使用，数据库里也不应该明文保存。本文用 Go 写一个入门版密码重置 token 流程。</description></item><item><title>Go database/sql 上下文入门：QueryContext、超时和连接释放</title><link>https://plumephp.com/go-sql-query-context-2024/</link><pubDate>Thu, 23 May 2024 11:21:00 +0800</pubDate><guid>https://plumephp.com/go-sql-query-context-2024/</guid><description>从一次查询接口出发，讲 database/sql 里 context 的使用、QueryContext、Scan、Rows 关闭、超时传播和常见连接泄漏问题。</description></item></channel></rss>