mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-28 05:46:36 +08:00
1.8 KiB
1.8 KiB
空白标识符模式
空白标识符 _ 在 Go 中有多种用途:丢弃不需要的值、为副作用导入包、以及在编译时验证接口实现。
多重赋值
使用 _ 丢弃多值表达式中不需要的值:
if _, err := os.Stat(path); os.IsNotExist(err) {
fmt.Printf("%s does not exist\n", path)
}
绝不要随意丢弃错误
静默丢弃错误会引发空指针 panic:
// 不好:忽略错误会在路径不存在时崩溃
fi, _ := os.Stat(path)
if fi.IsDir() { ... } // 空指针解引用
如果确实不需要错误,请记录原因:
_ = logger.Sync() // 尽力刷新;错误不可操作
副作用导入
使用空白标识符仅为了 init() 副作用而导入包:
import _ "net/http/pprof" // 注册 HTTP 处理器
import _ "image/png" // 注册 PNG 解码器
这通常用于注册驱动、编解码器或调试处理器,它们在 init() 期间将自己注册到注册表中。
接口实现检查
在编译时验证类型是否实现了接口,方法是将 nil 指针赋值给接口类型的空白标识符变量:
var _ io.Writer = (*MyType)(nil)
如果 *MyType 不满足 io.Writer,这会产生编译错误,在运行时之前捕获缺失的方法。
何时使用:将此检查放在定义该类型的同一文件中,通常在类型声明之后。当类型必须满足另一个包中定义的接口时特别有用。
参见 go-interfaces:接口满足检查,获取关于何时何地使用此模式的完整指导。
快速参考
| 模式 | 语法 |
|---|---|
| 丢弃值 | _, err := f() |
| 在 if 初始化中丢弃 | if _, err := f(); err != nil { } |
| 副作用导入 | import _ "pkg" |
| 接口检查 | var _ Interface = (*Type)(nil) |