首页
文章列表
标签墙
返回找工具啦
Go语言
共 133 篇文章
Go语言竞态条件在map并发读写时的崩溃复现
2026-05-05 19:20:24
Go语言竞态条件在map并发读写时的崩溃复现 Go 语言内置的 map 类型并不支持并发安全读写。当多个 goroutine 同时对同一个 map 进行写入或读写混合操作时,程序会抛出 fatal error 并崩溃。本指南将直接复现这一经典崩溃场景,并演示如何使用 Go 的竞态检测工具定位问题。
Go语言
并发编程
竞态条件
26
0
Go语言rangefunc自定义迭代器的函数签名
2026-05-05 09:16:37
Go语言rangefunc自定义迭代器的函数签名 Go 1.23 版本将 rangefunc(基于函数的 for range 循环)正式引入标准库。要编写一个能够让 for range 语句遍历的函数,必须严格遵守特定的函数签名规则。这些签名定义了迭代器如何与 Go 运行时交互,以及如何传递数据或终
Go语言
Go1.23
迭代器
28
0
Go语言regexp.MustCompile与regexp.Compile的panic区别
2026-05-05 06:28:34
Go语言regexp.MustCompile与regexp.Compile的panic区别 在 Go 语言开发中,处理正则表达式时,regexp 包提供了两个核心函数:regexp.Compile 和 regexp.MustCompile。两者的核心功能完全一致,都是将正则字符串编译成正则对象,但在
Go语言
正则表达式
错误处理
30
0
Go语言io.Reader接口的组合模式与管道链式读取
2026-05-04 20:19:17
Go语言io.Reader接口的组合模式与管道链式读取 在Go语言的标准库中,io.Reader 接口是处理数据输入的核心抽象。理解其组合模式与管道链式读取机制,能够让你像搭积木一样构建出高效且解耦的数据处理流。 理解 io.Reader 的本质 io.Reader 的定义极其简单,仅包含一个 Re
Go语言
Reader接口
组合模式
28
0
Go语言为什么没有泛型继承?接口组合的设计哲学
2026-05-04 15:18:26
Go语言为什么没有泛型继承?接口组合的设计哲学 Go语言刻意避开了传统面向对象语言中复杂的类型继承体系,转而推崇组合。即使Go 1.18引入了泛型,它依然没有引入类似Java或C那样的“泛型类继承”。理解这一设计哲学,关键在于区分“类型继承”与“接口组合”的本质区别。 理解“组合优于继承”的数学逻辑
Go语言
泛型
接口组合
33
0
Go语言atomic.CompareAndSwap的ABA问题与解决方案
2026-05-03 19:20:18
Go语言atomic.CompareAndSwap的ABA问题与解决方案 并发编程中,atomic 包提供的原子操作是保证数据安全的重要手段。其中 CompareAndSwap(简称 CAS)操作因为无需加锁而被广泛使用。但在特定场景下,CAS 操作存在一个隐蔽的逻辑漏洞,被称为 ABA 问题。以下
Go语言
并发编程
原子操作
36
0
Go语言slog结构化日志库的Handler自定义
2026-05-03 15:18:40
Go语言slog结构化日志库的Handler自定义 Go 1.21 版本引入了 log/slog 标准库,提供了强大的结构化日志功能。虽然内置的 TextHandler 和 JSONHandler 能够满足大部分基础需求,但在实际生产环境中,我们往往需要自定义日志格式(例如添加特定的分隔符)、过滤敏
Go语言
结构化日志
slog
35
0
Go语言context.Done()通道在取消时的关闭行为
2026-05-03 08:21:08
Go语言context.Done通道在取消时的关闭行为 在 Go 语言并发编程中,context 包是控制 Goroutine 生命周期的核心工具。理解 context.Done 通道在取消操作时的具体行为,对于编写优雅、不泄露资源的并发程序至关重要。本文将深入剖析 Done 通道的关闭机制,并通过
Go语言
并发编程
Context
40
0
Go语言select在default case下的非阻塞语义
2026-05-03 05:21:18
Go语言select在default case下的非阻塞语义 Go语言的 select 语句是处理多个通道操作的核心机制。通常情况下,select 会阻塞,直到其中一个 case 能够执行。然而,当 select 包含一个 default 分支时,其语义会发生根本性变化:它将不再阻塞,而是立即执行。
Go语言
select
非阻塞
35
0
Go语言Goroutine的GOMAXPROCS与CPU核心数的关系
2026-05-02 21:30:35
Go语言Goroutine的GOMAXPROCS与CPU核心数的关系 GOMAXPROCS 是 Go 语言运行时(runtime)中的一个关键参数,它直接决定了 Go 程序能够同时使用多少个操作系统线程来执行 Go 代码。理解它与 CPU 核心数的关系,是优化 Go 程序并发性能、特别是 CPU 密
Go语言
并发编程
CPU核心数
36
0
Go语言Defer语句在匿名函数中的闭包陷阱
2026-05-02 19:23:59
Go语言Defer语句在匿名函数中的闭包陷阱 Go语言中的 defer 语句常用于资源释放、解锁互斥锁或捕获错误。然而,当 defer 与匿名函数(闭包)结合使用时,变量捕获机制常常会导致代码运行结果与预期不符。这种“闭包陷阱”不仅难以排查,还可能引发严重的逻辑错误。以下步骤将详细复现这一陷阱,剖析
Go语言
Defer
闭包
37
0
Go语言通道的happens-before关系与内存可见性
2026-05-02 09:27:38
Go语言通道的happensbefore关系与内存可见性 Go语言的并发模型以通道为核心,理解通道的 happensbefore 关系是编写无数据竞争代码的关键。happensbefore 是内存模型中的术语,用于保证一个操作的结果对另一个操作可见。掌握这套规则,能让你在不依赖锁的情况下,安全地在
Go语言
并发编程
通道
41
0
Go语言net/http默认Transport的连接复用与Keep-Alive
2026-05-01 22:24:30
Go 语言标准库中的 net/http 是构建 HTTP 服务的首选工具,其底层的 Transport 负责管理 HTTP 连接。在默认配置下,Go 会自动启用连接复用和 KeepAlive 机制,这能显著减少 TCP 三次握手带来的延迟。理解并正确配置这些参数,是编写高性能网络应用的关键。 1.
Go语言
net/http
连接复用
29
0
Go语言time.After与context.WithTimeout的超时精度对比
2026-05-01 21:18:31
Go语言time.After与context.WithTimeout的超时精度对比 Go语言在处理并发超时控制时,主要提供两种机制:time.After 和 context.WithTimeout。虽然两者在底层都依赖相同的运行时计时器,但在资源管理、控制精度以及对高并发场景的适应性上存在显著差异。
Go语言
并发编程
超时控制
39
0
Go语言Goroutine栈的扩容与缩容机制
2026-05-01 19:28:25
Go语言Goroutine栈的扩容与缩容机制 Go语言的Goroutine(协程)之所以轻量,核心在于其内存占用极小。与操作系统线程动辄几MB的固定栈空间不同,Goroutine的栈空间是动态的,初始值非常小,并能根据需要进行伸缩。理解这一机制,有助于编写高性能且避免内存溢出的程序。 1. 理解初始
Go语言
协程
栈扩容
32
0
Go语言reflect反射的性能开销到底有多大
2026-05-01 17:17:11
Go语言reflect反射的性能开销到底有多大 Go语言的 reflect 包提供了强大的运行时反射能力,允许程序在运行时检查类型信息并操作对象。然而,这种灵活性并非没有代价。反射操作通常比直接代码调用慢得多,且涉及额外的内存分配。为了在代码中合理使用反射,必须量化其性能损耗,并掌握优化手段。 以下
Go语言
反射
性能优化
38
0
Go语言atomic.Value的Store与Load的原子性保证
2026-05-01 05:25:06
Go语言atomic.Value的Store与Load的原子性保证 Go语言中的 atomic.Value 提供了一种无需加锁即可并发安全地读写特定类型值的机制。其核心方法 Store 和 Load 保证了操作的原子性,但正确使用它们需要理解其底层的内存模型和类型约束。本文将直接演示如何利用 ato
Go语言
并发编程
原子操作
38
0
Go语言sync.Cond与channel在条件等待中的选择
2026-04-30 09:20:22
Go语言sync.Cond与channel在条件等待中的选择 在Go语言的并发编程中,让一个Goroutine等待特定条件成立是常见需求。Go标准库提供了sync.Cond(条件变量)和channel(通道)两种机制来实现这一功能。虽然两者都能达到“等待”和“通知”的目的,但它们的适用场景和底层逻辑
Go语言
并发编程
sync.Cond
42
0
Go语言切片扩容时的容量计算与内存重新分配
2026-04-30 00:22:40
Go语言切片扩容时的容量计算与内存重新分配 Go语言中的切片是对数组的抽象,使用起来非常灵活。但在使用 append 向切片追加元素时,切片的长度和容量会发生变化。如果不理解其背后的扩容机制,编写高性能程序时容易造成意外的内存浪费或性能瓶颈。 以下内容将深入剖析 Go 语言切片扩容时的容量计算规则及
Go语言
切片扩容
容量计算
36
0
Go语言testing.T.Parallel实现测试用例并行执行
2026-04-29 13:21:42
Go语言testing.T.Parallel实现测试用例并行执行 在 Go 语言项目开发中,随着代码量的增加,测试套件的运行时间往往会越来越长。缩短测试反馈循环是提升开发效率的关键手段。Go 标准库中的 testing 包提供了 t.Parallel 方法,能够将顺序执行的测试用例转换为并行执行,从
Go语言
并行测试
单元测试
38
0
上一页
1
2
3
4
5
6
7
下一页