












https://go.dev/doc/effective_go#blank_implements
在编译期断言某类型实现了某接口
var _ I = (*T)(nil)
var _ 声明一个匿名变量(_ 表示丢弃,不会实际使用)
声明一个接口类型 I 的变量,把 *T 的零值赋给它。
*T 没有实现接口 I 的所有方法,编译器直接报错,程序根本跑不起来。而 _ 变量不会被使用,所以不会生成任何运行时代码。_ 作为变量名,不会占用任何有意义的标识符。var _ json.Marshaler = (*RawMessage)(nil)
目的是让编译器检查RawMessage有没完全实现json.Marshaler这个接口, 没有这句, 如果以后json.Marshaler加了新方法, 但RawMessage 没新加这个方法的实现, 编译时不会报错, 等用到时再报错就麻烦了.
或用把变量转成了接口, 然后调用接口中的方法, 但没实现, 现在提前检查就没这种问题.
这是一种零成本、编译期生效的"契约声明",是 Go 社区广泛采用的惯用写法(idiomatic Go),在 Effective Go 和标准库代码中都能看到。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。