02 Uber Go 语言编码规范 - 指导原则 - interface 合理性验证

本文介绍了在开发过程中如何利用编译器的检查机制来验证接口的合理性。通过将实现接口的类型作为接口API的一部分进行检查,确保所有实现接口的类型都符合接口定义。例如,对于HTTP处理程序,如果Handler未正确实现http.Handler接口,编译器将在编译阶段报错。通过定义`var _ http.Handler = (*Handler)(nil)`来强制进行接口检查,如果接口不匹配,编译将失败。这种方法有助于提前发现和修复问题,提高代码质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开发interface时,要对interface的合理性进行验证,在编译时验证接口的符合性。这包括:

  • 将实现特定接口的导出类型作为接口API的一部分进行检查
  • 实现同一接口的(导出和非导出)类型属于实现类型的集合
  • 任何违反接口的合理性检查的场景,都会终止编译,并通知给用户

补充:以上3条是编译器对接口的检查机制,大体意思是错误的使用接口会被编译器报错。所以可以利用这个机制让部门问题提前暴露。
源代码

// 如果Handler没有实现http.Handler,会在运行时报错
type Handler struct {
  // ...
}
func (h *Handler) ServeHTTP(
  w http.ResponseWriter,
  r *http.Request,
) {
  ...
}

改进后

type Handler struct {
  // ...
}
// 用于触发编译期的接口的合理性检查机制
// 如果Handler没有实现http.Handler,会在编译期报错
var _ http.Handler = (*Handler)(nil)
func (h *Handler) ServeHTTP(
  w http.ResponseWriter,
  r *http.Request,
) {
  // ...
}

如果 *Handler 与 http.Handler 的接口不匹配,那么语句var _ http.Handler = (*Handler)(nil)将无法编译通过。
赋值的右边应该是断言类型的零值。 对于指针类型(如 *Handler)、切片和映射,这是 nil; 对于结构类型,这是空结构。

type LogHandler struct {
  h   http.Handler
  log *zap.Logger
}
var _ http.Handler = LogHandler{}
func (h LogHandler) ServeHTTP(
  w http.ResponseWriter,
  r *http.Request,
) {
  // ...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xf491698144

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值