Go语言技术文章
-
Go 的 append 是否修改调用方,关键取决于切片共享的底层数组和剩余 cap。本文拆解 len、cap、返回值、三下标切片与复制边界。471 收藏 -
Go 的 unicode.IsNumber 判断的是 Unicode 数字类别 N,不等于只判断 0 到 9,也不等于能识别所有中文汉字数字。本文对比 IsNumber、IsDigit 与汉字数字的边界,并给出按业务规则筛选 rune 的写法。422 收藏 -
nil map 读取缺失键返回零值,写入却会 panic。以表单状态为例说明 nil 与空 map、写入方法初始化、函数返回新 map 以及嵌套 map 的责任边界。400 收藏 -
Go netip.ParsePrefix 并不会因为 CIDR 地址的主机位非零而拒绝输入。本文从 ParsePrefix 与 Prefix.Masked 的职责边界出发,解释 192.168.1.7/24 的解析结果、真正会触发错误的条件,以及如何在网段存储和 Contains 判断前做规范化。201 收藏 -
解释 Go map 在 range 期间删除和写入的真实边界:单 goroutine 可原地过滤,新增键是否继续遍历不确定,并发读写必须同步。298 收藏 -
Go 的 netip.Addr.String 会保留 IPv6 Zone;真正容易丢失 Zone 的位置通常是 As16、AsSlice、net.IP 转换或 Prefix。本文按字符串化、结构化比较和转换边界说明如何定位问题。317 收藏 -
裸 IPv6 不等于主机加端口。说明 SplitHostPort 的方括号要求,用分字段校验示例正确组装端点,并区分 IP、域名、数字端口和 URL 的输入边界。238 收藏 -
Go 的 net.Resolver.Dial 只服务于 Go 内置 DNS 解析器;如果当前解析路径选择系统解析器,设置 Dial 也不会接管请求。本文说明 PreferGo、Dial 和实际调用对象之间的关系,并给出排障清单。355 收藏 -
Go http.Server.SetKeepAlivesEnabled(false) 控制的是服务端 HTTP keep-alive,不是 TCP keep-alive,也不能替代 Shutdown。本文说明临时排空、Server 生命周期、优雅停机和常见未生效原因。102 收藏 -
Go 的 url.URL 把 Path 保存为解码后的路径,RawPath 只是可选的编码提示。本文从一个路径编码不一致的场景出发,说明 RawPath 何时有效、何时会被 EscapedPath 忽略,以及如何避免双重编码。216 收藏 -
ServeMux 尾斜杠跳转的方法变化要结合实际状态码和客户端规则。用首跳诊断示例区分历史301与当前307,说明路径注册、正文重放和405排查。332 收藏 -
Go 1.22+ 的 ServeMux 会在注册阶段检查 pattern 是否存在无法排序的重叠;本文用请求集合解释冲突原因,并给出消除重复匹配的排查清单。265 收藏 -
Go ReverseProxy 转发后 Host 变化,通常是 Rewrite 中调用 SetURL 后出站 Host 跟随目标主机所致。本文区分 Request.Host、URL.Host 与 X-Forwarded-Host,并给出保留入站 Host、受控转发和迁移检查方法。189 收藏 -
Go 自定义 Transport 后 HTTP/2 不再生效,常见原因不是服务端突然关闭,而是 Dial、DialContext、DialTLS 或 TLSClientConfig 触发了保守默认。本文给出 ForceAttemptHTTP2、Protocols、ALPN 与连接复用的排查顺序。250 收藏 -
Go TLS 握手出现 ServerName 与证书 SAN 不匹配时,通常是客户端验证的主机名、SNI 发送的名称和证书中的 DNSNames 或 IPAddresses 没有对齐。本文按证据拆开三者关系,给出安全配置和排障边界。374 收藏