推荐
精选文章与内容推荐
Go 扩展并发原语与分布式并发
前面几篇我们讲了标准库的并发原语、atomic 和 Channel,掌握这些已经能解决 80% 的并发问题。但要进一步提升并发编程能力,还需要了解 扩展并发原语 和 分布式并发原语。这篇文章分两部分:上半部分讲 Go 官方和社区提供的进程内扩展原语(Semaphore、SingleFlight、ErrGroup、CyclicBarrier),下半部分讲基于 etcd 的分布式并发原语(Leader …
阅读全文 →Go 并发原语 - Channel
Channel 是 Go 语言内建的 first-class 类型,也是 Go 与众不同的特性之一。它不是通过库提供的——而是直接内置在语言规范中,地位之高在编程语言中比较罕见。Channel 的设计源自 CSP(Communicating Sequential Process)模型:不要通过共享内存来通信,要通过通信来共享内存。
一、Channel 基本用法 声明和初始化 Copy // …
阅读全文 →Go 并发原语 - atomic
前面讲 Mutex、WaitGroup 等并发原语的实现时,你会发现它们的底层都依赖 sync/atomic 包的原子操作。原子操作是并发编程的最底层基石——比锁更轻量、比 Channel 更快,适合特定场景下的高性能并发控制。这一篇我们专门来讲 atomic。
一、什么是原子操作? 原子操作是指 不会被中断的操作。在其他 goroutine 看来,原子操作要么已经完成,要么还没开始,不会看 …
阅读全文 →Go 并发原语 - Context
并发编程中,除了"互斥访问"和"等待通知"之外,还有一类核心需求——取消和超时控制。比如:HTTP 请求超时了,下游所有 goroutine 都应该停止工作;用户取消了操作,正在进行的数据库查询应该被中断。Go 标准库的 context 包就是为了解决这类问题而生的。
一、Context 解决什么问题? 假设一个 HTTP 请求触发了多个 goroutine …
阅读全文 →Go 并发原语 - Pool
Go 是自动垃圾回收的语言,创建对象没有回收的心理负担。但如果你要开发高性能应用,就必须关注 GC 的影响——大量创建堆上的对象,会增加 GC 标记的时间和 STW(stop-the-world)的开销。对象池 是一种经典的优化手段:把不用的对象回收起来复用,减少堆分配和 GC 压力。Go 标准库提供了 sync.Pool 来实现这个目的。
这篇文章我们先讲 sync.Pool 的用法和原理,再扩 …
阅读全文 →Go 并发原语 - Map
前面几篇我们聊了各种同步原语,这一篇聊一个更贴近日常开发的话题——map 的并发安全。Go 内建的 map 类型不是线程安全的,并发读写会直接 panic。那怎么办?这一篇我们从内建 map 的基本用法和陷阱开始,逐步讲到加锁方案和标准库的 sync.Map。
一、内建 map 基本用法 Go 的 map 是内建的哈希表类型:
Copy m := make(map[string]int) …
阅读全文 →Go 并发原语 - Once
前面几篇我们聊了 Mutex、WaitGroup 和 Cond,它们各自解决不同维度的并发问题。这一篇聊一个相对简单但极其实用的原语——sync.Once,它解决的是 “确保某个操作只执行一次” 的问题,最经典的场景就是单例资源的延迟初始化。
一、为什么需要 Once? 单例资源的初始化有好几种方式,按执行时机可以分成两类:
Copy …
阅读全文 →Go 并发原语 - Cond
前两篇我们聊了 Mutex 和 WaitGroup,它们分别解决"互斥访问"和"等待一组任务完成"的问题。但并发编程中还有一类需求——等待某个条件满足后再继续执行。比如:队列满了,生产者要等;队列空了,消费者要等。这就是 sync.Cond(条件变量)要解决的问题。
一、为什么需要 Cond? 假设你要实现一个限定容量的队列:队列满时生产者阻塞,队列空时消费 …
阅读全文 →Go 并发原语 - WaitGroup
上一篇我们聊了 Mutex,它解决的是"同一时刻只能有一个 goroutine 访问共享资源"的问题。但并发编程中还有另一类常见需求——等待一组任务全部完成后再继续。这就是 sync.WaitGroup 要解决的问题。
一、为什么需要 WaitGroup? 假设你要并行执行三个子任务,全部完成后才能进入下一步。没有 WaitGroup 的话,你可能会这样写:
Copy // ❌ …
阅读全文 →Go 并发原语 - Mutex
并发编程是 Go 的灵魂,而 Mutex(互斥锁) 是并发控制的第一道防线。这篇文章带你从"为什么需要锁"开始,一路走到 Mutex 的演进原理、常见坑点和读写锁 RWMutex,争取一文把 Mutex 讲透。
一、没有锁的世界有多危险? 先看一个经典的并发计数器问题:
Copy package main import ( "fmt" …
阅读全文 →用 AI 重构我的个人网站:从 WordPress 到 Hugo
为什么要告别 WordPress? WordPress 是一个优秀的内容管理系统,但对于一个想要通过 AI 工具(如 Claude Code)来管理内容的开发者来说,它有几个痛点:
内容存储在数据库中,AI 工具无法直接读写 PHP + MySQL 的技术栈维护成本高 安全更新需要频繁关注 动态渲染相比静态站点速度慢 新方案:Hugo + Adritian 最终选择了 Hugo 作为静态站点生成 …
阅读全文 →Go 语言后端开发实践总结
为什么选择 Go? Go 语言在后端开发中的优势不言而喻:
编译速度快:秒级编译,开发体验流畅 并发原语优秀:goroutine + channel 模型简洁强大 部署简单:单二进制文件,无依赖 性能优异:接近 C 的性能,远超脚本语言 项目结构推荐 Copy project/ ├── cmd/ # 应用入口 │ └── server/ │ └── main.go ├── internal/ # …
阅读全文 →