Go问答技术文章
-
Go 的 trace.NewTask 适合标记会跨多个 goroutine 接力完成的逻辑操作。本文用一个并发汇合示例说明如何传播任务 Context、安排 Task.End,并用 Region 和 Log 补足阶段信息。208 收藏 -
Go 服务需要持续观察 goroutine 数量、调度队列和等待延迟时,可以使用标准库 runtime/metrics,而不必依赖 pprof。本文从 All 和 Read 的采样入口讲到 Value.Kind、计数值与直方图处理,并说明两者在生产观测中的分工。214 收藏 -
runtime.GOMAXPROCS 限制的是同时执行用户级 Go 代码的并行度,不是操作系统线程总数。本文用 G、P、M 和阻塞系统调用说明线程数为何可能高于设置值,并给出容器与本地程序的排查顺序。477 收藏 -
Go 反射中,Value.Elem 遇到 nil 指针会返回 zero Value。先用 IsValid 判断,再对可空 Kind 调用 IsNil,并在每次 Elem 后保留成功标志,就能避免继续访问无效 Value。403 收藏 -
Go 反射中,reflect.Value.IsZero 可直接判断有效值是否为类型零值,不要求切片、映射和函数可比较。本文区分无效 Value、nil 容器、空容器与接口比较 panic,并说明何时使用 Comparable 或 DeepEqual。197 收藏 -
Go checkptr 报错通常可归到指针对齐、跨分配对象或指针算术越界三类问题。本文结合 unsafe.Pointer、uintptr 和原始分配对象,说明如何定位并修复不安全转换。347 收藏 -
unsafe.StringData 返回的是字符串底层字节的只读 *byte。本文区分 Go 指针、uintptr 和 cgo 边界,说明空字符串、NUL 结尾、KeepAlive 与长期保存的正确处理方式。316 收藏 -
解释 Go runtime.KeepAlive 为什么要紧跟系统调用放置,帮助排查 finalizer 过早关闭文件描述符导致的偶发 EBADF。316 收藏 -
Go encoding/xml 遇到属性和子元素同名时,不要复用一个字段。用不同 Go 字段分别标记 xml:"code,attr" 和 xml:"code",即可让 Unmarshal 与 Marshal 清晰区分两种 XML 来源。130 收藏 -
Go encoding/xml 解码 XML 时,前缀只是文档别名。本文用 xml.Name.Space 和 Local 说明如何按命名空间 URI 稳定判断元素,并比较 Token 级解析与结构体标签的适用边界。434 收藏 -
用 Go 的 encoding/xml 流式读取 XML 时,EndElement 不是靠字符串猜测匹配。本文用 xml.Name 栈解释嵌套结束标签、自闭合标签、命名空间和 io.EOF 的判断方式。312 收藏 -
Go JSON 指针字段设为 nil 后仍输出,通常是因为标签没有 omitempty,nil 会被编码为 null。本文从最小结构体、标签检查、接口契约和自定义 MarshalJSON 四个方向定位原因。334 收藏 -
讲清 Go json.Decoder.Token 如何用嵌套深度定位连续 JSON 流中的对象边界,并说明什么时候应改用 Decode 保留完整字段内容。240 收藏 -
讲清 Go json.Decoder 开启 DisallowUnknownFields 后的未知字段错误,给出按 API 版本分流严格与兼容解码、检查尾部数据、记录迁移和逐步收紧的实用方案。228 收藏 -
Go 程序明明访问 HTTPS,结果却一直使用 HTTP/1.1,排查时不要只盯着 ForceAttemptHTTP2。本文按客户端声明、TLS 握手选择和 HTTP 实际协议三个层次,说明应记录的字段、常见冲突以及最小复现代码。283 收藏