Go语言技术文章
-
用 Go 的 io.MultiWriter 把一次 Write 分发到多个 Writer,重点解释目标对象、指针形式、返回值以及某个目标出错后为什么后续目标不会继续收到本次数据。297 收藏 -
net.Dialer 的 KeepAlive 只能让操作系统在 TCP 层探测空闲连接,不能替代应用层心跳,也不能绕过服务端或中间设备的空闲策略。本文给出可复用的拨号器写法,并说明如何收敛超时、重连与心跳边界。297 收藏 -
Golang · Go问答 | 4星期前 | 结构体 · 单元测试 · go · 结构体比较 Go go-cmp cmp.Equal Equal方法 cmp.Transformer cmp.Comparer
go-cmp 的 cmp.Equal 在没有被选项覆盖时,会优先调用符合签名的 Equal 方法,因此不会继续逐字段比较。本文拆解这个决策顺序,并给出用 Transformer 去掉 Equal 方法、或用 Comparer 明确覆盖的测试写法。296 收藏 -
Go 通过域名连接时,如果 IPv6 地址优先但链路实际不可达,连接可能出现异常等待。本文拆分 DNS 与 TCP 阶段,说明如何用 DialContext、Fast Fallback 和有限超时处理。296 收藏 -
用 atomic.Pointer 发布不可变配置快照,让并发读请求通过 Load 获取完整配置,并用 Store 或 CompareAndSwap 替换指针槽位,避免读到半更新状态。296 收藏 -
Go 的 net.DNSError.Timeout 只能表示标准库已知的 DNS 超时,不能把所有 false 都当成没有超时。本文用 errors.As 穿过错误包装,区分已知超时、未找到记录和普通失败,并说明上下文截止时间与重试策略的边界。296 收藏 -
Go math/big.Int 的 Append 方法会把整数按指定进制的文本表示追加到已有 []byte 缓冲区。本文说明缓冲区复用、进制与前缀、负数和 nil 边界,并对比 Bytes 与 FillBytes 的二进制语义。296 收藏 -
go-smtp 通过 SendMail 的 []string 或 Client 的多次 Rcpt 调用,把多个地址加入同一封邮件的 SMTP envelope。本文进一步区分 To、Cc、Bcc 头部与实际投递地址,并说明拒收和连接清理边界。296 收藏 -
Go GC 回收对象与向系统归还空闲页是不同工作,RSS 不会保证立刻下降。本文用原创采样程序区分 HeapAlloc、HeapIdle、HeapReleased 与系统内存口径,说明主动归还及软内存限制的边界。296 收藏 -
用 Go archive/tar 把大文件直接流式写入 tar 归档,准确设置 Header.Size,复用 io.Copy 处理单文件、多文件和网络输出,避免把整个文件读入内存。296 收藏 -
Go sqlmock 默认把预期 SQL 当正则表达式处理,问号和括号会改变匹配语义。本文说明如何用 regexp.QuoteMeta 或 QueryMatcherEqual 修复测试。295 收藏 -
解释 Go defer 参数求值、闭包捕获和 Go 1.22 循环变量语义,给出跨版本固定每轮值的写法。295 收藏 -
Go 的 filepath.ToSlash 只负责把当前系统路径分隔符转换成斜杠,适合生成跨平台资源键、归档条目和 URL 风格路径。本文用一个资源清单场景拆开 ToSlash、Clean、path 与 PathEscape 的边界。295 收藏 -
Go 的 http.Header.Get 只返回同名请求头的第一个值,完整读取应使用 Header.Values。本文结合 Add、Set、Get、Values 的差异,说明大小写规范化、直接 map 访问和返回切片复制的排查边界。295 收藏 -
Go Ticker.Stop 不会关闭通道,也不会终止工作 goroutine。通过串行周期任务示例,说明计时器所有权、Context 取消、done 完成确认,以及慢任务和新旧计时通道语义。295 收藏