Go问答技术文章
-
Go channel 的关闭责任应由能确认所有发送结束的一方承担。本文用单发送方、多发送方和取消信号三个场景,说明如何避免向已关闭 channel 发送导致 panic。393 收藏 -
Go channel 关闭后接收仍会得到元素类型的零值,不能只看 v 判断结束。本文用 comma-ok 区分有效零值、关闭空 channel 和 nil channel,并说明缓冲 channel 的正确消费方式。361 收藏 -
解释 Go 中 nil channel 的阻塞语义,以及如何用 select default 对可选通道做非阻塞尝试,同时区分 nil、未就绪和 closed channel。183 收藏 -
Go 中从 nil channel 接收不会返回零值,而是永久阻塞;只有已关闭且已耗尽的 channel 才会返回元素类型零值并令 ok 为 false。本文用状态对比和可取消示例说明排查与修复边界。111 收藏 -
Go 中向 nil channel 发送会永久阻塞,本文从运行时语义、排查路径和修复边界说明如何定位声明遗漏、select 门控与退出控制问题。345 收藏 -
看到 Go 编译报告中的 moved to heap 时,不要只凭一条提示判断性能。本文用 -gcflags=-m=2 追踪地址和生命周期,再结合 -benchmem 对照确认是否值得优化。328 收藏 -
go vet 的 printf 检查可以在编译前发现格式化动词与参数数量、类型不匹配的问题。本文用最小示例解释诊断信息、修复方式,以及自定义日志包装函数如何接入检查。263 收藏 -
Go runtime.SetFinalizer 只能作为非内存资源释放的兜底,不能替代显式 Close。本文从 GC 触发时机、进程退出、循环引用、KeepAlive 和幂等关闭几个边界说明正确的资源生命周期设计。497 收藏 -
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 收藏