用 Golang 写接口服务时,我最在意的三个细节

context、超时、错误返回和并发边界。

Go 很适合写接口服务,因为它的并发模型直接、部署形态简单、运行时开销稳定。但越是直接的工具,越需要在工程习惯上保持克制。

第一个细节是 context。一次请求从进入服务开始,就应该携带可取消的上下文。访问数据库、调用下游接口、启动短生命周期 goroutine 时,都应该尊重这个 context,避免客户端已经断开,服务端还在继续消耗资源。

第二个细节是超时。没有超时的网络调用是不完整的接口设计。对外部服务、缓存、数据库连接池都应该有明确的超时策略,否则局部抖动很容易扩散成整个服务不可用。

第三个细节是错误返回。Go 的 error 很朴素,但接口层不能把内部错误原样丢给用户。我更倾向于在内部保留详细日志和 trace id,在外部返回稳定的错误码、可理解的信息,以及必要时的重试建议。

Go 服务写得好不好,不只看 goroutine 用得多不多,而是看并发边界是否清晰、资源释放是否可靠、失败路径是否和成功路径一样被认真设计。