Go问答技术文章
-
Go 的 defer 可能在函数真正返回前修改命名返回值。本文用错误包装场景拆开 return 与 defer 的执行顺序,并给出显式返回、只读观测和测试检查的实用写法。155 收藏 -
Go defer 并不是把整次函数调用推迟到退出时才计算。普通调用会在 defer 登记时保存函数值和参数,匿名函数则通常在真正执行时读取闭包变量。掌握这个差异,就能解释 defer 打印旧值、闭包读到新值等常见现象。177 收藏 -
Go 的 panic 沿当前 goroutine 调用栈展开,recover 只有在同一 goroutine 的 deferred 函数中直接调用才会生效。本文用原创示例说明错误位置、保护函数和 channel 传递边界。434 收藏 -
fmt.Errorf 用 %v 和 %w 生成的错误文本可以一样,但 %v 会切断错误链,让 errors.Is 和 errors.As 无法继续判断底层错误。本文用一个原创示例说明两者差异,并给出是否公开底层错误的取舍规则。407 收藏 -
errors.Is 匹配不到自定义包装错误,通常不是错误文本的问题,而是 %w 包装链、Unwrap 关系、自定义 Is 方法集或值指针形态出了偏差。本文用对照代码和测试拆开三类失败。283 收藏 -
Go 的 time.Parse 不使用 yyyy-MM-dd 这类占位符,而是用 2006-01-02 这组参考时间。本文从最小修复、错误判断、时区和格式化几个方面说明如何排查日期解析失败。233 收藏 -
Go 的 time.Time 默认通过 MarshalJSON 输出 RFC3339 字符串,时区表现为 Z 或数值偏移,纳秒来自原始时间值。本文说明如何理解默认结果,并用 Format 明确控制 API 的时区与精度。487 收藏 -
Go 的 json omitempty 不会按传统规则省略结构体值字段。本文用最小示例说明值字段、指针字段和未提供状态的区别。409 收藏 -
Go 将 JSON 解码到 any 时会默认使用 float64,大整数超过双精度可精确表示范围后可能被改写。本文用复现、UseNumber 和明确整数类型说明如何保留精度。321 收藏 -
json.Decoder 面向输入流读取下一个顶层 JSON 值,所以多个值可以连续 Decode。本文解释这种设计,并给出严格单值校验和流式读取的实用写法。118 收藏 -
Go 的 *string 字段在 JSON 缺失和显式 null 时都可能得到 nil,无法直接表达 PATCH 接口的三态语义。本文用自定义 UnmarshalJSON 类型保留字段是否出现、是否为 null 以及具体值,并说明复用结构体时的常见误判。315 收藏 -
Go 的 url.QueryUnescape 把加号解成空格是查询编码规则,不是字符串损坏。本文用对比例子说明查询参数、路径文本、QueryEscape 和错误处理应该如何配套使用。116 收藏 -
Go 的 URL.Path 保存解码后的路径,RawPath 只用于保留有效的原始编码提示;如果把已编码字符串直接放进 Path,URL.String 或 HTTP 客户端会再次转义百分号,形成 %252F。493 收藏 -
Go 的 HTTP 响应头必须在第一次 WriteHeader 或 Write 之前设置;本文用 handler 分支说明隐式 200、最终状态码、http.Error 与 trailer 的边界。424 收藏 -
ReadHeaderTimeout 保护请求头读取,WriteTimeout 限制响应写回,IdleTimeout 只管理 keep-alive 连接等待下一请求。本文按请求阶段比较三者的边界、重置规则和回退关系,并给出普通接口、慢上传与长响应的配置判断方法。266 收藏