Go语言技术文章
-
Go errors.As 返回 false 时,先看错误实现的 Error 接收者和实际动态类型,再决定目标变量是 *T 还是 T。本文用一个小型校验错误示例说明指针错误、值错误、%w 包装和常见声明误区。483 收藏 -
crypto/rand.Text 返回的不是任意字母数字串,而是基于 RFC 4648 Base32 的密码学安全文本。本文从官方实现拆开字符集合、长度与自定义字符表的边界。329 收藏 -
Go 的 recover 只能处理当前 goroutine 正在展开的 panic,父 goroutine 的 defer 无法跨线程接住子 goroutine 的异常。本文拆解正确的入口包装、结果回传和失败处理方式。294 收藏 -
Go RWMutex 并不是让新读者无限插队:写者一旦等待,新的 RLock 会被挡住。写锁仍然长期等待时,优先检查已经持有的读锁、RUnlock 配对、递归读锁、其他写者排队和写临界区长度。125 收藏 -
Go channel 做 semaphore 时,先用 len 和 cap 判断再发送并不能保证并发上限。正确做法是让带缓冲 channel 的发送直接负责获取许可,接收负责释放,并用 select 表达不等待策略。239 收藏 -
Go atomic.Pointer 的 Load 读到 nil,通常不是原子操作失效,而是对象尚未 Store、代码显式发布了 nil,或读取时机早于初始化发布。本文用最小示例和轻量指标拆开这些边界,并补充复制 atomic.Pointer 的风险。347 收藏 -
Go atomic.Int32 适合保存一个可原子读取和更新的 int32 状态。本文用有限状态示例说明 CompareAndSwap 的 expected、next 与 bool 返回值怎样配合,解释 CAS 失败、状态回退、结构体复制和多字段一致性等边界。375 收藏 -
Go Ticker 的 Stop 只停止后续 tick,不会关闭 C 通道,也不会自动清空调用方保存的旧指针或 channel。本文区分停止发送、关闭通道、解除引用和 GC 回收,给出可退出的接收循环与清理边界。349 收藏 -
解释Timer.Stop后仍看到事件的原因,区分新旧通道语义、已接收数据与AfterFunc回调,并通过单一拥有者和退出确认示例说明取消协议及旧排空写法限制。401 收藏 -
Go time.After 在高频循环中会反复创建一次性 Timer,额外成本来自创建、运行时调度和回收路径。本文解释 Go 1.23 的回收语义,并给出复用 Timer 的判断与写法。342 收藏 -
Golang · Go问答 | 1星期前 | 字符串 · go · unicode · utf-8 · Go问答 · Go 字符串长度 UTF-8 unicode/utf8 RuneCountInString
Go 的 len(string) 统计字节,而 utf8.RuneCountInString 统计解码后的 rune 数量,所以中文和 emoji 常常出现两个结果。本文进一步说明非法 UTF-8 与用户感知字符的边界。253 收藏 -
Go regexp 中点号默认不匹配换行,是因为 s 标志默认关闭。本文用最小示例说明 (?s)、局部分组 (?s:...) 与 m 标志的区别,并整理 CRLF 和匹配范围边界。354 收藏 -
Go strings.Split 返回空元素通常不是异常,而是前置、连续或尾部分隔符保留了空字段位置。本文结合代码说明 Split、空分隔符与 Fields 的边界,并给出保留或过滤空字段的判断清单。267 收藏 -
Go archive/zip 找不到中文文件名,通常不是文件内容问题,而是 ZIP 目录项的名称编码标记、实际名称或斜杠路径不一致。本文说明如何判断 NonUTF8、正确创建 UTF-8 文件名,以及外部编码压缩包的处理边界。276 收藏 -
区分tar硬链接与符号链接的目标语义,解释前向引用失败原因,给出延迟依赖解析组件,说明缺失目标、循环依赖、创建错误及接口兼容策略。292 收藏