-
Go测试网络错误需用MockHTTPClient模拟异常,如超时、连接拒绝、5xx状态码、空body、JSON解析失败等,通过自定义RoundTripper或httptest.Server精确控制响应,并断言具体错误类型确保覆盖边界。
-
RPC调用失败时应区分错误类型并精准重试:net/rpc用*rpc.Error判断Code,gRPC须用status.FromError()解包再判Code;仅对codes.Unavailable等临时性错误按指数退避重试≤3次。
-
直接测handler函数时用httptest.NewRecorder;需完整HTTP生命周期(如重定向、中间件、TLS)才用httptest.NewServer。前者轻量快速,适合90%单元测试;后者启真实服务,易致端口冲突、变慢,属集成测试范畴。
-
直接用context.Context传traceID不够用,因其仅作值传递载体,不自动生成、传播或上报链路数据,需手动提取、注入和透传,易断链;真正需自动注入、跨协程继承、跨进程透传及框架对齐。
-
必须先调用r.ParseMultipartForm(32<<20)设置MaxMemory,再通过r.MultipartReader()或r.FormFile()安全读取文件,避免直接读r.Body导致OOMpanic。
-
Asynq启动连不上Redis需检查地址、密码及连接池配置;handlerpanic因类型名不一致或注册时机错误;幂等需任务ID加业务层唯一校验;本地开发推荐DockerRedis而非mock;测试用asynq.TestClient;CI可用miniredis。
-
必须使用influxdb-client-go/v2官方SDK对接InfluxDB2.x,因协议层彻底变更:接口统一为/api/v2/、认证仅支持token;WriteAPI默认异步且错误静默,须调Flush()检查;Point时间戳不可为零值;bucket/org名严格匹配;Flux查询需显式yield()并正确处理多表结构。
-
标准log包无日志级别功能,必须换库(如zap)或用构建tag条件编译;zap开发与生产配置差异大,需按场景选用;logrusSetLevel非线程安全,须启动时设定或加锁保护。
-
Go语言HelloWorld需严格满足packagemain和funcmain(),用gorun快速验证,gobuild生成跨平台静态二进制,init()在main前执行。
-
Go变量影子(shadowing)是什么,为什么它危险变量影子是指在内层作用域(比如if、for、func内部)用同名变量重新声明,导致外层同名变量被“遮蔽”。这不是语法错误,Go编译器允许,但极易引发逻辑bug:你以为在改外层变量,实际只改了内层副本。常见错误现象:err在iferr!=nil块里用:=重声明,结果函数返回时用的仍是未赋值的外层err,导致panic或静默失败。使用场景集中在错误处理、循环体、嵌套函数中——尤其是习惯Python/JS的
-
Go语言中Goroutine池的核心是通过固定数量的workergoroutine从任务队列中取任务执行,避免资源耗尽,实现并发控制与复用。
-
Go模块依赖由go.sum校验和与go.mod版本共同锁定,伪版本(如v0.0.0-20230405102030-abc123def456)精确锁定commit,确保可重现;go.sum强制校验包完整性,不可手动编辑,CI/CD必须提交。
-
GOMAXPROCS=1时goroutine仍可交替运行,因主动让出(如Sleep、Gosched、channel、系统调用)触发P交还控制权,实现单P上的并发调度,非并行;计算密集型循环无让出则无法切换。
-
使用Go构建日志系统需结构化输出(如zap)、集中采集(Filebeat/Loki)和上下文追踪,通过JSON日志与统一平台实现高效查询与告警。
-
在Golang中实现Web表单自动验证,需结合结构体标签与反射机制,推荐使用go-playground/validator库。1.定义结构体时通过validate或binding标签声明规则,如required,email;2.利用validator.New()创建验证器并调用Struct()方法执行校验;3.在Gin等框架中通过ShouldBind自动触发验证,错误时返回具体字段与原因。需注意字段名匹配及类型转换问题,以确保数据准确解析。