Go问答技术文章
-
bbolt 的 View 回调里再次调用 Update 可能长期阻塞。本文解释单写事务与读事务的生命周期关系,给出读取结果复制到事务外、再独立写入的处理方式,以及回滚、告警和复盘清单。158 收藏 -
Go json.Unmarshal 遇到 JSON null 时会按目标类型处理:指针字段被设为 nil,普通 string 等非指针字段通常保持原值。本文用结构体示例拆开指针、普通字段和字段缺省的边界,帮助排查接口入参中的 nil 现象。158 收藏 -
Go HTTP Server 流式下载应优先监听 r.Context().Done(),并把取消信号传给上游数据源;ResponseWriter.Write 错误作为补充信号,及时停止读取并释放资源。158 收藏 -
Golang · Go问答 | 1天前 | 结构体 · Go问答 · Go 结构体标签 go/ast go/types reflect.StructTag types.Struct Struct.Tag
Go types.Struct.Tag 返回的是字段标签字符串,空字符串既可能来自未设置标签,也可能来自空原始标签。本文对比 AST 的 Field.Tag、go/types.Struct.Tag 和 reflect.StructTag.Lookup,说明三种层次分别能保留什么信息。158 收藏 -
Go 里常说的 DNSResolver 实际通常指 net.Resolver。若自定义 Dial 始终连首选 DNS,查询超时后不会自动切换到备用服务器;本文拆开 Dial、context 和查询级主备策略,用两个 Resolver 与独立超时预算实现可审查的 DNS 故障切换,并说明缓存、并发和系统解析器的边界。157 收藏 -
Go groot 读取 ROOT 文件时,同名对象并不是同一个 key:不带 cycle 默认取最高版本,name;cycle 才能定位历史对象。本文用 Keys、Get 和 Put 说明判断与排查方法。157 收藏 -
Go genetlink 中 Protocol、Family.ID、Family.Version 和 Header.Version 位于不同层次。本文用 generic netlink 请求说明家族版本与协议版本的区别,以及如何避免把错误数字写入命令头。157 收藏 -
Go net.SplitHostPort 解析带端口的 IPv6 地址时,方括号用于标出主机边界。本文解释 too many colons、missing port、zone 和 JoinHostPort 的关系,帮助你正确生成与拆分 host:port。157 收藏 -
用bits.Mul64取得uint64乘法的完整高低位,解释高位判定溢出、低位为零的含义、返回状态以及重组和类型转换的常见错误。157 收藏 -
Go 的 sync.RWMutex 不支持把 RLock 直接升级成 Lock。持有读锁时获取写锁会等待包括自己在内的读者退出,正确做法是释放读锁、获取写锁并重新检查共享状态。157 收藏 -
Go 解析 YAML 配置时,普通值字段会把缺失、显式空值和合法零值揉成一个结果。本文用指针字段、默认值阶段与校验顺序拆开这三种状态,避免默认值覆盖用户明确传入的空值。156 收藏 -
Go 同包测试运行在同一个测试进程里,包级可变变量会被前一个测试留下的状态影响。本文区分普通测试、子测试、t.Parallel、TestMain 与测试缓存的边界,并给出保存恢复和工厂函数两种隔离写法。156 收藏 -
Go multipart 上传文件读到空内容,常见原因是字段名或 boundary 不匹配、请求体被提前消费、文件流已经位于 EOF。本文用 FormFile 与 MultipartReader 说明如何按证据定位并修复。156 收藏 -
ResponseController.Flush 返回成功只代表 Go 端把当前缓冲交给下一跳,经过反向代理后仍可能被代理继续缓存。排查时先确认 ResponseWriter 的 Flush 能力,再关闭对应接口的 proxy_buffering 或设置 X-Accel-Buffering: no,并区分直连与代理链路。156 收藏 -
Go test -run 使用不锚定正则筛选测试,遇到子测试时还会按斜杠拆分名称;本文整理顶层测试、t.Run 路径、名称清洗和命令引号导致匹配不到的排查方法。156 收藏