
在 Go 语言中,当调用返回多个值的函数(如 stmt.Exec())却只关心部分结果时,可使用空白标识符 _ 忽略不需要的变量,从而避免“unused variable”编译错误。
在 go 语言中,当调用返回多个值的函数(如 `stmt.exec()`)却只关心部分结果时,可使用空白标识符 `_` 忽略不需要的变量,从而避免“unused variable”编译错误。
Go 是一门强调显式性和类型安全的语言,其编译器严格要求所有声明的变量必须被使用,否则会报错(例如 sqlRes declared and not used)。这虽然增加了代码严谨性,但也要求开发者主动处理每个返回值。
在数据库操作中,sql.Stmt.Exec() 方法签名如下:
func (s *Stmt) Exec(args ...interface{}) (sql.Result, error)
它始终返回两个值:一个 sql.Result(通常用于获取影响行数或最后插入 ID)和一个 error。若你仅需检查执行是否成功,而无需 sql.Result,正确的做法是用空白标识符 _ 显式忽略它:
stmt, err := db.Prepare("INSERT INTO person (name) VALUES (?)")
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
_, err = stmt.Exec(person.Name) // ✅ 正确:忽略 Result,保留 error 检查
if err != nil {
log.Printf("执行插入失败: %v", err)
}
⚠️ 注意事项:
- 不可写成 _, _ = stmt.Exec(...) —— 这会同时丢弃 error,导致无法感知执行失败;
- 若后续需要获取影响行数,应保留 sql.Result 并调用 res.RowsAffected();
- db.Exec()(无预编译)同样适用该模式:_, err := db.Exec("INSERT...", person.Name);
- 空白标识符 _ 仅可用于赋值语句右侧,不可用于类型声明或函数参数。
总结:Go 中“忽略返回值”不是省略,而是显式放弃——使用 _ 表达设计意图,既满足编译器要求,又保持逻辑清晰与错误可追溯性。











