Go问答技术文章
-
Go map 不是并发容器,多个 goroutine 无同步地读写同一个 map 时可能触发 concurrent map read and map write 或 concurrent map writes。本文说明根因,并比较普通 map 加 RWMutex、sync.Map 与 channel 所有权模型的适用边界。284 收藏 -
filepath.Glob遇到非法模式会返回ErrBadPattern,忽略err才容易误认为普通空结果。本文给出最小错误处理写法,区分无匹配与目录读取问题,并说明相对路径、星号和跨平台转义的边界。417 收藏 -
Go os.Open 失败时返回的是错误和不可用的文件对象,不能继续 Read、Stat 或 Close。本文说明先判错再使用的写法,解释 PathError 的原因识别,以及成功打开后如何安全管理 Close。234 收藏 -
Go os.Stat 失败时不要只比较错误字符串:用 errors.Is 区分文件不存在与权限拒绝,再从 PathError 提取操作和路径信息,覆盖中间目录不可访问等排障边界。195 收藏 -
ReadString在EOF时可能同时返回非空数据,过早退出会丢掉没有换行的末段。本文提供带状态的消费函数,区分空文件、空行、正常末段和读取异常,并说明CRLF、资源责任与实时追加输入的不同约定。203 收藏 -
Go 的 math.Signbit 判断浮点数符号位,因此能识别负零;x < 0 判断的是数值顺序,负零与零相等所以不会命中。本文用 Copysign、Float64bits 和 NaN 边界说明两种判断的使用场景。438 收藏 -
Go encoding/csv 默认按较严格的 CSV 引号规则解析。本文说明 Reader.LazyQuotes 放宽的两类引号错误、开启时机、ParseError 处理方式,以及为什么容错读取不能替代下游数据质量控制。322 收藏 -
Go encoding/xml 映射命名空间失败时,关键不是记住 XML 前缀,而是让结构体标签匹配命名空间 URI。本文用 XMLName、xml.Name 和 Decoder.Token 逐层定位字段为空的原因。127 收藏 -
Go csv.Reader.TrimLeadingSpace 只忽略字段开始处的空白,不会删除引号包裹内容内部的空格。本文用最小示例拆开引号外、引号内两种位置,并说明注释、分隔符和字段数量设置的边界。235 收藏 -
Go把JSON数字解码到通用接口时通常使用float64,部分大整数因此发生舍入。本文结合导入标识场景,比较UseNumber、int64字段和字符串契约,并说明范围错误、上游精度丢失与跨服务迁移的处理方法。323 收藏 -
Go 的 encoding/json 解码到 *T 时,字段缺省和显式 null 都可能得到 nil,单靠指针无法区分。本文用 RawMessage 和泛型 Optional 保存字段是否出现、是否为 null 以及实际值,帮助接口更新和默认值处理避免语义丢失。334 收藏 -
Go 的默认 JSON 解码会忽略结构体没有声明的字段。本文用 DisallowUnknownFields 让未知字段直接返回错误,并说明错误处理、兼容期和嵌套结构的边界。134 收藏 -
Go 的 math.Ilogb 返回浮点数的二进制整数指数,不是普通的 Log2 结果。本文从 2 的幂、非整数幂和 Frexp 对比入手,解释零、无穷大、NaN 的特殊返回值,并给出选择函数和封装边界。123 收藏 -
Go 的 url.Values.Encode 将查询参数中的空格编码为加号是正常的表单编码语义;本文用最小示例区分空格、字面加号和路径片段,给出解码回路与请求构造边界。100 收藏 -
Go Request.GetBody 为 nil 时,先区分重定向重放和应用层重试,再用可重复创建 Body 的请求工厂保证每次上传读取同一份数据。122 收藏