Files
OpenFlare/.agents/skills/go-control-flow/references/BLANK-IDENTIFIER.md
T
2026-08-04 11:40:32 +08:00

1.8 KiB
Raw Blame History

空白标识符模式

空白标识符 _ 在 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)