惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The GitHub Blog
The GitHub Blog
IT之家
IT之家
B
Blog RSS Feed
罗磊的独立博客
GbyAI
GbyAI
博客园 - Franky
Y
Y Combinator Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Google DeepMind News
Google DeepMind News
博客园 - 聂微东
N
Netflix TechBlog - Medium
博客园 - 三生石上(FineUI控件)
人人都是产品经理
人人都是产品经理
U
Unit 42
博客园 - 叶小钗
Jina AI
Jina AI
MyScale Blog
MyScale Blog
雷峰网
雷峰网
B
Blog
Hugging Face - Blog
Hugging Face - Blog
Blog — PlanetScale
Blog — PlanetScale
Recent Announcements
Recent Announcements
腾讯CDC
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园 - 悉野

Go 的类型断言 ssh连结vmware中ubuntu的共享文件夹 spring加载冲突问题 spring一个错误修正 抓安卓日记到文件 注册表删除桌面顽固图标 github买的账号无法拉取代码的解决方法 apk常用命令 java服务器异常处理 ES6 学习难度分层 promise原理 材质, 纹理, shader之间的关系 TCP与UDP区别 javascript中=>与function的区别 javascript中函数解析过程 cocos使用fgui 几种服务注册与发现的区别 mybatis测试 向量点乘与叉乘 unity画布3种渲染模式 go学习笔记10(HTTP) go学习笔记9(TCP) go学习笔记8(反射) c++简单的线程池 operator new 是 C++ 动态内存分配的核心函数,负责分配原始内存,不调用构造函数 C++的定位放置new(Placement new) go学习笔记7(泛型,文件读写,测试) go学习笔记6(协程与channel,select使用,线程安全,异常处理) go学习笔记5(函数,结构体,自定义类型和类别名,接口) go学习笔记4(数组与切片,map,if,switch,for循环)
go编译期接口断言 / 编译期接口检查(compile-time interface...
悉野 · 2026-09-04 · via 博客园 - 悉野

interface checks

https://go.dev/doc/effective_go#blank_implements

在编译期断言某类型实现了某接口

var _ I = (*T)(nil)

var _ 声明一个匿名变量(_ 表示丢弃,不会实际使用)

声明一个接口类型 I 的变量,把 *T 的零值赋给它

  • 编译期检查,零运行时开销:如果 *T 没有实现接口 I 的所有方法,编译器直接报错,程序根本跑不起来。而 _ 变量不会被使用,所以不会生成任何运行时代码。
  • 提前暴露问题:不用等到运行时才发现类型没实现接口,在编译阶段就能捕获错误。
  • 文档作用:其他开发者看到这一行,立刻就知道"类型 T 的指针是要实现接口 I 的",起到自文档化的效果。
  • 不污染命名空间:用 _ 作为变量名,不会占用任何有意义的标识符。

var _  json.Marshaler = (*RawMessage)(nil)

目的是让编译器检查RawMessage有没完全实现json.Marshaler这个接口, 没有这句, 如果以后json.Marshaler加了新方法, 但RawMessage 没新加这个方法的实现, 编译时不会报错,  等用到时再报错就麻烦了.

或用把变量转成了接口, 然后调用接口中的方法, 但没实现, 现在提前检查就没这种问题.

这是一种零成本、编译期生效的"契约声明",是 Go 社区广泛采用的惯用写法(idiomatic Go),在 Effective Go 和标准库代码中都能看到。