
在 Go 中,若函数返回多个值但你仅需其中部分(如只关心错误 err,忽略 sqlRes),可通过下划线 _ 空标识符丢弃不需要的返回值,既满足编译要求,又保持代码简洁。
在 go 中,若函数返回多个值但你仅需其中部分(如只关心错误 err,忽略 sqlres),可通过下划线 `_` 空标识符丢弃不需要的返回值,既满足编译要求,又保持代码简洁。
Go 语言强制要求所有声明的变量必须被使用,否则编译失败(报错 unused variable)。这虽提升了代码严谨性,但在调用如 stmt.Exec() 这类返回 (sql.Result, error) 的函数时,若仅需检查错误而无需操作影响行数、最后插入 ID 等结果,直接声明 sqlRes 就会触发编译错误。
此时应使用 Go 的空标识符(blank identifier) _ —— 它不是变量名,而是专门用于“占位并忽略”的语法符号。它可出现在任何需要变量名的位置(如短变量声明、多重赋值、range 循环等),且不占用内存、不可读取。
正确写法如下:
stmt, err := db.Prepare("INSERT INTO person (name) VALUES (?)")
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
// 忽略 sql.Result,只保留 error
_, err = stmt.Exec(person.Name)
if err != nil {
log.Fatal(err)
}
⚠️ 注意事项:
- 不可在同一作用域内对同一变量重复声明:_, err := stmt.Exec(...) 是错误的(因 err 已由上一行声明),应改用 _, err = stmt.Exec(...)(无 :=,表示重新赋值);
- 若完全不需要 sql.Result 且也不关心 error(不推荐),可写作 _, _ = stmt.Exec(...),但务必处理错误,否则将掩盖数据库异常;
- 空标识符仅用于明确“有意忽略”,不可滥用——若未来需获取影响行数(如 sqlRes.RowsAffected())或插入 ID(sqlRes.LastInsertId()),应保留变量并命名清晰(如 res 或 result)。
总结:_ 是 Go 处理多返回值中冗余项的标准、安全且符合惯用法的方式,合理使用它,能让代码既通过编译,又准确表达开发者的意图。











