Go语言技术文章
-
Go reflect.Value.MethodByName 找不到方法时会返回零 Value,不能直接 Call。本文说明 IsValid 判断、导出方法与大小写、值接收者和指针接收者差异,以及反射调用前的签名检查。236 收藏 -
Go flag.FlagSet 的空结果通常不是没有解析,而是输入没有位置参数、flag 仍使用默认值,或解析在第一个非 flag 参数处停止。本文用最小示例拆开 Parse、NArg、Args、Arg 和 Parsed 的边界。236 收藏 -
Go types.MethodSet 只返回方法,不负责列出结构体字段。本文区分 MethodSet、types.Struct 和选择器查找,并说明嵌入字段的方法提升与同名冲突边界。236 收藏 -
读取带长度前缀的二进制帧时,bufio.Reader.Read 可能短读,不能把一次 Read 当成完整帧。本文用 io.ReadFull 读取帧头和 payload,按 binary.BigEndian 解析长度,并在分配内存前做上限校验。236 收藏 -
用同一枚 maphash.Seed 为进程内多个独立 Hash 建立一致的哈希规则,并说明 Reset、并发共享和跨进程持久化的边界。236 收藏 -
Go encoding/base64 返回 CorruptInputError 时,怎样把错误值还原为零基字节偏移,并区分非法字符、填充错误、尾部垃圾和 Strict 模式错误。235 收藏 -
Go TLS 主机名校验的关键是把拨号地址与证书名称分开看:使用 tls.Config.ServerName 指定证书校验名和 SNI,保留默认证书链校验,并用 x509.VerifyHostname 理解 DNS、IP、通配符和 Common Name 的边界。235 收藏 -
bytes.Buffer 的 Reset 会清空当前长度,但会保留底层存储。本文用 Len、Cap 和阈值策略说明如何复用正常大小的缓冲区,并隔离偶发的大容量缓冲区,避免复用池长期持有异常对象。235 收藏 -
Go atomic.Bool 适合维护读多写少的服务开关。本文从请求判断、管理侧切换、Swap 与 CompareAndSwap 的差异出发,说明零值、不可复制和不撤销已开始任务等边界。235 收藏 -
Go x/text/language.Parse 解析的是 BCP 47 语言标签,不是任意文本清洗器。本文区分格式错误、未知值和部分解析结果,说明 Parse、Make、MustParse 与 ParseAcceptLanguage 的选择边界。235 收藏 -
用一个有界任务队列说明 Go sync.Cond 的条件等待、关联锁、Wait 循环以及 Signal 与 Broadcast 的选择,重点解释为什么被唤醒后仍要重新检查共享状态。235 收藏 -
Go csv.Reader.TrimLeadingSpace 只忽略字段开始处的空白,不会删除引号包裹内容内部的空格。本文用最小示例拆开引号外、引号内两种位置,并说明注释、分隔符和字段数量设置的边界。235 收藏 -
Go LDAP 的空密码不是普通登录失败的另一种写法。本文区分 Bind、UnauthenticatedBind 和 AllowEmptyPassword 的职责,给出认证意图封装与连接隔离示例,避免把未认证会话误当成用户身份。235 收藏 -
用 Hamba Avro 把 Go 结构体编码成 Avro record 时,核心是让 schema 字段、avro 标签和 Go 类型一一对应。本文分别说明 avro.Marshal、NewEncoder、字段类型映射和最小回读方式。235 收藏 -
Go 的 tls.ConnectionState.NegotiatedProtocol 为空,不一定表示 TLS 握手失败,可能是没有配置 ALPN、对端没有启用 ALPN,或读取时机早于握手完成。本文按值班排障顺序说明 NextProtos、HandshakeComplete、协商结果和回滚边界。235 收藏