Go问答技术文章
-
Go benchmark 的 allocs/op 偏高时,不要先猜编译器或垃圾回收;从测试夹具、循环内临时值、切片扩容、字符串转换和逃逸边界逐项拆分,才能定位真正的分配来源。322 收藏 -
Go 表驱动测试加上 t.Parallel 后,多个子测试可能读到同一个循环变量。本文解释暂停时机、Go 版本差异、局部绑定写法和 -race 排查边界。444 收藏 -
Go test -run 匹配不到子测试名称,通常是忽略了父子测试名称的斜杠分段。本文用原创示例解释逐层正则、空段、锚点和特殊字符的写法,并给出 -list 排查清单。386 收藏 -
go test -race 报告读写冲突时,不要只看两行文件位置;要沿访问栈、创建栈和共享存储边界确认真正被并发访问的变量,再选择锁、channel 或 atomic 修复。352 收藏 -
go vet 报 copylocks 通常说明包含 Mutex 等同步对象的结构体被按值传递或复制。本文解释值接收者、参数、赋值和 range 的风险,并给出指针接收者与无锁快照的修复方式。246 收藏 -
Go 遇到 import cycle not allowed 时,问题不是 import 写法,而是包依赖图形成了闭环。本文用 go list 定位循环,并比较接口倒转依赖与共享类型下沉两种拆分方式。446 收藏 -
Go internal 包能否导入,不是只看 go.mod 是否相同,而是看调用方是否位于 internal 父目录树内。本文用目录结构和最小示例解释失败原因,并给出移动目录、公开包和拆分模块的修复边界。380 收藏 -
解释 Go go:linkname 与普通 import 的区别,定位 Go 1.23 标准库内部符号链接失败的原因,并给出公开 API、handshake 与最小验证建议。448 收藏 -
Go 泛型函数使用 == 报 cannot use T as comparable 时,重点检查 any 约束是否过宽。本文说明 comparable 的正确用法、与方法约束的组合、接口运行时边界,以及类型不可比较时如何改用比较键。338 收藏 -
Go 泛型值不能直接写 v.(type),因为类型参数不是接口类型。先转换为 any 再做 type switch;若要匹配当前类型参数,可在接口表达式上使用 case T,并注意实例化后的分支重复。187 收藏 -
Go 泛型约束并不会自动继承所有类型实参的方法。本文用类型集、方法集和指针接收者示例说明哪些调用能写、哪些必须补进约束。244 收藏 -
Go 反射调用 Set 失败,先不要把问题归因于类型不匹配。ValueOf 的值拷贝通常不可寻址,指针解引用后才可能获得可设置值;未导出字段和 MapIndex 还有额外边界。本文用 CanAddr、CanSet、Elem 和最小示例快速定位。396 收藏 -
Go 反射访问未导出字段时,Value.Interface 会因封装边界触发 panic。本文用 CanInterface 判断访问能力,并给出类型化读取、公开方法和 DTO 拷贝的选择。330 收藏 -
Go 的 sql.DB.Ping 只能说明连接探活成功,不能替代真实 SQL、权限、事务和连接池检查。本文给出分层排查与健康检查设计方法。466 收藏 -
SetMaxOpenConns(1) 会把所有需要数据库连接的并发操作压到单车道,吞吐下降通常来自连接获取等待。本文用 DBStats 区分排队与 SQL 慢,并给出连接池调参方法。137 收藏