Go问答技术文章
-
Go 拼接 URL 时不要直接使用 filepath.Join:文件路径按操作系统规则处理,URL 需要保留 scheme、host、path、query 和编码边界。本文对比 filepath.Join、path.Join、url.JoinPath,并给出路径参数与查询参数的正确写法。387 收藏 -
Go encoding/csv 默认按首条记录校验后续列数,本文解释 ErrFieldCount 的原因,并给出固定列定位坏行、变长记录安全读取和字段策略选择方法。221 收藏 -
Go encoding/xml 遇到带命名空间前缀的标签时,匹配关键不是 soap、o 这样的前缀,而是命名空间 URI 与 Local 名。本文用结构体标签和 xml.Name 说明排查方法。428 收藏 -
Go 的 int 字段不能直接接收 JSON 字符串中的数字。固定返回 "123" 时使用 json:",string",同时兼容数字和字符串时用自定义 UnmarshalJSON 配合 strconv.ParseInt,并明确空值、小数和溢出策略。434 收藏 -
Go 的 time.Time 只按 RFC3339 读取 JSON 时间。遇到 yyyy-MM-dd HH:mm:ss、仅日期或缺少时区的字段,应先接收字符串,再用明确 layout 解析;本文给出结构体、自定义类型和排查清单。302 收藏 -
Go 的 encoding/json 默认会忽略结构体没有定义的 JSON 字段。本文说明如何用 Decoder.DisallowUnknownFields 严格拒绝多余字段,并把它安全接入 HTTP 接口。273 收藏 -
Go 的 nil slice 和非 nil 空 slice 长度都为 0,但 encoding/json 默认分别编码为 null 和空数组。本文解释两种状态、omitempty 的影响,以及如何在 API 响应层稳定输出 []。153 收藏 -
Go 的 http.Client.Do 返回 404 时 err 仍可能是 nil,因为非 2xx 状态属于服务器响应,不是传输错误。本文区分 err、StatusCode 和响应体读取错误,给出关闭 Body、限制错误正文并映射业务错误的写法。496 收藏 -
Go 的 encoding/json 默认会把 JSON 字符串中的小于号写成 \u003c,这通常是 HTML 安全转义而不是乱码。本文说明如何判断、何时使用 SetEscapeHTML(false),以及关闭后仍需遵守的 HTML 安全边界。474 收藏 -
Go 用 archive/zip 生成的 ZIP 无法打开时,先检查条目写入、zip.Writer.Close 和底层输出的关闭顺序,再用 zip.Reader 区分截断、写入失败与 CRC 校验问题。489 收藏 -
Go map 单值读取时,缺失键和实际零值看起来一样。本文用双值索引解释如何判断键是否存在,并覆盖 nil map、不同值类型、默认值与业务封装边界。298 收藏 -
Go 的 sync.Mutex 可以使用零值,但首次使用后不能再复制。本文说明按值传参、range、返回值为什么会复制锁,并给出指针接收者、快照类型和 go vet 检查方案。233 收藏 -
Go sync.Pool 里的对象会消失,是因为它只承诺临时对象复用,不承诺持久保存:池中元素可被运行时自动移除,Get 也可能直接把池当作空池。本文用 New、Get、Put 示例说明正确用法,并划清 sync.Pool 与业务缓存的边界。109 收藏 -
Go 的 bytes.Buffer.Bytes 返回的是共享底层存储的未读区域切片。本文区分 Read、Write、Reset、Truncate 带来的视图失效与真实覆盖,并给出安全复制方案。462 收藏 -
Go 的 Header.Get 返回空字符串时,先检查是否用 Header.Set 或 Header.Add 写入、是否把请求头和响应头对象混用了,以及是否直接向 map 写入了非规范化键。118 收藏