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