Go问答技术文章
-
nil channel 永远无法完成发送或接收,因此对应 select case 永远不会进入可执行候选集。本文用双输入 fan-in 说明置 nil 的动态门控模式,并对比关闭通道、空通道、全 nil 死锁与上游泄漏等边界。234 收藏 -
Go sync.Cond 的 Wait 返回只表示收到通知,不代表共享条件已经成立。本文用队列式示例说明为什么必须在循环中重新检查条件,并梳理 Signal、Broadcast 与锁的配合边界。339 收藏 -
Go 的 sync.Mutex 首次使用后不能复制。本文用结构体赋值和值接收者说明复制如何造成永久等待或保护失效,并给出指针接收者、go vet 与并发测试的修复清单。416 收藏 -
json.RawMessage 本质上是保存原始 JSON 字节的切片,普通赋值只复制切片描述,两个变量仍可能共享底层数组。本文用 Unmarshal 和直接修改两个场景定位别名来源,并给出 bytes.Clone、append 到 nil 切片的深拷贝写法与隔离检查清单。109 收藏 -
Decoder.UseNumber 只把 interface 中的 JSON 数字保留为 json.Number,避免先转 float64;它不会替目标类型检查范围。转换为 int64、uint64 或 big.Int 时仍要检查错误与业务上限。297 收藏 -
json.Decoder.Decode 返回 nil 只说明成功读取了下一个 JSON 值,并不保证输入流已结束。本文用二次 Decode 与 io.EOF 检查,区分空白结尾、第二个 JSON 值和非法尾随字节。194 收藏 -
在 Go 服务之间使用 OpenTelemetry 时,HTTP 客户端和服务端 Span 不是靠 URL 或时间戳硬拼,而是依靠传播的 Trace Context 建立父子关系。本文用 otelhttp 拆解注入、提取和常见失配原因。456 收藏 -
Go bufio.Scanner 的 Buffer 参数同时涉及初始缓冲区和 token 最大上限。本文用长行读取示例说明如何按数据分布设置 max,如何处理 token too long,以及什么时候应该改用 bufio.Reader。178 收藏 -
解释 Go bufio.Scanner 遇到 ErrFinalToken 时的停止条件,区分最后 token、nil token、Scan 返回值和 Scanner.Err。116 收藏 -
Scanner.Bytes 返回的是当前 token 的字节切片视图,不保证在下一次 Scan 后继续有效。本文用一个小工具复现变化原因,并比较即时处理、bytes.Clone、append 复制与 Text 的适用边界。136 收藏 -
Go 服务接入 OpenTelemetry 后,如果 Trace 仍然无法显示清晰的调用关系,通常要从 service.name、HTTP 入出站埋点、上下文传播和批量导出四个边界排查。本文给出一套原创接入思路。335 收藏 -
Go 的 os/exec.StdoutPipe 返回子进程标准输出的读取端,必须先完成管道读取再调用 Cmd.Wait。本文解释管道关闭、输出回压和等待顺序,并给出单路读取、双路消费与 Output 的选择方法。497 收藏 -
Go exec.Cmd.Cancel 默认会直接 Kill 子进程。本文用自定义取消信号配合 WaitDelay,说明如何给子进程清理机会、限制管道等待,并正确判断取消后的错误边界。418 收藏 -
说明 Go exec.Cmd.WaitDelay 的计时边界、管道继承与 StdoutPipe 调用顺序,给出超时和 ErrWaitDelay 的区分处理方案。433 收藏 -
本文解释 Go EvalSymlinks 为何要求路径组件真实存在,并给出现有路径、断链与待创建目标的正确处理方式。223 收藏