Go问答技术文章
-
Go 的缓冲 channel 满载后,普通发送会等待消费者。用 select 同时监听 ch <- value 与 ctx.Done(),就能在取消或超时后返回 ctx.Err,避免生产者 goroutine 一直卡住。100 收藏 -
Go 的 <-chan 参数只能接收,不能发送或调用 close。本文解释单向通道的类型权限、关闭责任和安全的函数签名写法。459 收藏 -
Go 的 copy 可以安全处理共享底层数组的重叠切片。本文从源切片、目标切片和复制数量入手,说明切片移动、扩容复制以及三索引切片限制之间的区别。259 收藏 -
Go 1.21 起可以用 clear 清空 map。它保证删除所有条目并保留 map 的可写语义,但 Go 没有 map 的 cap 接口,也没有承诺 clear 立即释放底层存储。本文用别名、nil map 和重新 make 的对比说明什么时候只是清空内容,什么时候应该替换整个 map。277 收藏 -
循环里写 defer f.Close() 时,Close 不会在本轮循环结束,而会等外围函数返回。本文解释原因,并给出单次迭代函数、关闭错误处理和资源边界选择。167 收藏 -
自定义错误想让 errors.Is 匹配,关键是实现 Is(error) bool;Error 只负责展示,Unwrap 只负责暴露包装链。本文用配额错误小项目演示哨兵错误、%w 包装、浅比较和误匹配测试。246 收藏 -
清理函数再次 panic 时,直接让第二个 panic 穿过 defer 可能遮住业务异常。本文用局部 recover 和 PanicChain 保留两类信息,并说明三种结果如何处理。300 收藏 -
Go defer 不能凭空改写普通返回表达式。本文对比命名返回值、指针和闭包的作用范围,说明 return 与 defer 的执行关系,并给出错误包装和资源清理的选择边界。198 收藏 -
Go 1.23 的 range over function 如何停止生产方?本文用 iter.Seq、yield bool 和 iter.Pull 说明 break、return 后的停止合同与 defer stop 收尾方式。210 收藏 -
Go 测试断言抽成辅助函数后,t.Helper 如何让失败行号回到测试调用点,以及多层断言包装该怎样逐层标记。283 收藏 -
Go 泛型约束中的 ~T 表示底层类型为 T 的类型集合。本文用 UserID、类型别名和联合约束说明 ~int 的匹配范围,并解释 ~MyInt、重叠集合与非基本接口为什么会编译失败。168 收藏 -
Go 原生 fuzz 测试的可复现性取决于 seed corpus 管理。本文区分 F.Add、testdata/fuzz 和 GOCACHE/fuzz,说明如何保留固定边界样例、沉淀失败输入并用 go test 稳定回放。389 收藏 -
用 Go testing.T.Deadline 取得测试总截止时间,在昂贵准备前判断剩余预算,并通过 context.WithDeadline 让可取消的准备工作及时停止。107 收藏 -
Go 1.20 之后接口类型可以满足 comparable 约束,但接口值仍可能因动态值不可比较而 panic。本文用类型集合、严格可比较和泛型调用示例拆清这个边界。454 收藏 -
同一个 Go 服务进程也能按租户切出 CPU 采样上下文。本文用 pprof.Do 和 pprof.Labels 说明标签写入、goroutine 继承、同名覆盖及高基数边界。404 收藏