-
推荐使用t.Log、t.Logf和t.Error记录Go测试日志,这些方法线程安全且仅在失败或加-v时显示;t.Log输出调试信息,t.Logf支持格式化,如t.Logf("输入值:a=%d,b=%d",a,b);运行gotest-v可查看日志;t.Error和t.Errorf记录错误并标记失败但继续执行,适合收集更多上下文信息。
-
直接用time.Time的Before、After、Equal比较时间顺序最准确,它们基于纳秒级UTC值自动处理时区,无需转字符串或时间戳;但须检查Parse错误避免零值时间干扰,且勿依赖Format结果肉眼判断。
-
根本解法是将业务日志重定向至可控载体(如bytes.Buffer),而非禁用或仅调整格式;需在测试中替换日志输出、注入唯一test_id、显式启用Debug级别并确保flush。
-
依赖注入通过反射实现结构体字段自动注入,利用标签识别依赖,结合类型注册与递归构建对象图,支持接口注入与单例管理,在初始化阶段完成依赖解析以提升运行时性能。
-
应直接使用golang.org/x/time/rate而非手写令牌桶:它已通过高并发、时钟漂移、上下文取消等验证;channel实现存在时钟跳变失准、不支持多令牌消耗、无Delay预估等缺陷;需缓存time.Now()避免单请求内时钟抖动误判;按IP/用户ID用sync.Map管理独立限流器;burst是最大积压数非并发数;HTTP中优先用limiter.Wait(r.Context())并确保ctx可取消。
-
Go database/sql 查询循环结束并不等于读取完整成功,本文从连接中断、Rows.Close 和事务提交三个现场拆开 Rows.Err 的检查边界,并给出可复现的代码与验收方法。
-
用gobuild-gcflags="-m=2"查看输出,出现“caninline”或“inliningcallto”即成功内联;若含“cannotinline”及原因(如defer、闭包、递归等),则失败;跨包调用默认不内联,//go:inline仅对非接口方法有效且须紧贴声明。
-
select分支执行顺序是伪随机轮询而非随机或按代码顺序;当多个case就绪时,Go以per-Goroutine伪随机起始索引轮询,防饿死但不可预测;default优先级最高,仅有一个case就绪则直接执行,全阻塞则goroutine挂起。
-
测试多线程函数需解决执行顺序不可控、资源竞争和测试提前结束问题,应使用sync.WaitGroup或channel确保所有goroutine完成。
-
gomobile不是UI框架,仅将Go函数编译为AndroidAAR或iOSFramework供原生调用;必须指定合法module路径(不支持.),Android需main包含main函数,iOS需//export注释导出函数。
-
以慢接口排查为线索,讲 Go pprof 的 CPU、heap、goroutine、block profile 使用顺序和常见误判。
-
直接用Eval容易出错,因go-redis的Eval要求*redis.Script实例而非字符串,且keys和args必须严格分离为[]string和interface{}切片,否则导致类型错误、越界或脚本内无法访问参数。
-
Go语言通过反射可动态获取结构体方法,核心是使用reflect.TypeOf获取类型对象,再调用NumMethod和Method遍历方法;需注意值接收者与指针接收者差异:值类型只能访问值接收者方法,而指针类型可访问两者;通过reflect.Method可获取方法名、类型签名及函数值,进而实现动态调用。
-
值类型直接存储数据,变量间相互独立;指针类型存储地址,可共享和修改同一内存数据。
-
GoHTTP服务器需显式创建ServeMux、校验Method/Content-Type、配置超时、包装ResponseWriter以实现可观察性与可靠性。