《Concurrency in Go》学习笔记

最近由于 并发性能优化复盘 开始看并发编程相关的书籍,希望借着书把并发相关的内容给摸清。现在看的差不多了,可以写篇学习笔记记录下。 首先,并发不是并行这个不用解释了。 ...

2026-06-20 · xhy

并发性能优化复盘

上周服务治理系统的同事(注意不是客户)发现一个问题,他调用的 api 接口不稳定。有时候正常,有时候报错,关键是大部分时候都是报错。 更关键的是这个接口是我开发的。 ...

2026-06-18 · xhy

go net/http 学习笔记

概述 在使用 Go 开发时几乎都会用到 net/http 标准库。但是,对库的内部实现不了解,仅限于会用。遇到问题容易懵,比如: 长连接和短连接有什么区别?具体什么实现原理? net/http 如何处理并发请求? net/http 有用到缓存吗?缓存用来干什么? …… 单个问题各个击破,不如深入梳理下 net/http 标准库一网打尽。本文将深入学习 net/http 标准库,力图做到知其然知其所以然。 ...

2025-12-07 · xhy

go ants pool 协程池学习笔记

概述 使用 Go 开发并发程序很容易,一个 go 关键字就可以启动协程处理任务。Go 创建一个 goroutine 只需要 2K 内存空间,并且 go 协程上下文信息仅存储在两个寄存器中,对于 Go 运行时来说,切换上下文特别快。 ...

2025-11-24 · xhy

go sync.pool 学习笔记

概述 sync.pool 对象池可以用来复用临时对象,减少内存压力,降低 GC 压力。 示例 基本用法 1type Worker struct{} 2 3func (w *Worker) Name() string { 4 return "worker" 5} 6 7func main() { 8 workerPool := sync.Pool{New: func() interface{} { 9 return Worker{} 10 }} 11 12 worker := workerPool.Get().(Worker) 13 defer workerPool.Put(worker) 14 15 name := worker.Name() 16 fmt.Println(name) 17} sync.pool 是单对象池,不是多对象池。基本使用方法是 Get 和 Put 方法,Get 用来从对象池中取对象,Put 用来将不用的对象放回对象池中。 ...

2025-11-09 · xhy

go 源码编译流程

Go 源码编译流程 Go 编译源代码需要经过编译,链接过程。通过以下示例看 Go (Go 版本为 v1.24.1)语言是如何编译源码的。 首先,代码目录结构如下: 1➜ demo1 git:(main) ✗ tree ./ 2./ 3├── cmd 4│ └── app1 5│ └── main.go 6└── pkg 7 └── pkg1 8 └── pkg1.go 9 10// main.go 11package main 12 13import "github.com/TroyXia/effective-go-book/chapter3/demo1/pkg/pkg1" 14 15func main() { 16 pkg1.Func1() 17} 18 19// pkg1.go 20package pkg1 21 22import "fmt" 23 24func Func1() { 25 fmt.Println("pkg1.Func1 invoked") 26} 编译 app1 main.go 为可执行文件: ...

2025-07-27 · xhy

Go runtime 调度器精讲(十一):总览全局

前言 前面用了十讲介绍了 Go runtime 调度器,这一讲结合一些图在总览下 Go runtime 调度器。 状态转换图 首先是 Goroutine 的状态转换图: 大部分转移路径前面几讲也介绍过,这里就不继续介绍了(下同)。 ...

2024-09-17 · xhy

Go runtime 调度器精讲(十):异步抢占

前言 前面介绍了运行时间过长和系统调用引起的抢占,它们都属于协作式抢占。本讲会介绍基于信号的真抢占式调度。 在介绍真抢占式调度之前看下 Go 的两种抢占式调度器: ...

2024-09-16 · xhy