Go语言原生支持多返回值,常用于“结果+error”模式以实现显式错误处理;可命名返回参数提升可读性与defer支持;多返回值不宜超过4–5个,否则应封装为结构体。

Go语言原生支持多返回值,这是它区别于许多其他语言的重要特性之一。函数可以同时返回多个值,常用于“结果 + 错误”这种经典组合,让错误处理更显式、更安全。
多返回值函数的基本写法
定义函数时,在函数名后的括号中列出所有返回类型,用括号包裹,类型之间用逗号分隔。如果多个连续返回值类型相同,可合并简写。
例如,一个计算两个整数商和余数的函数:
func divide(a, b int) (int, int) {if b == 0 {
return 0, 0 // 实际中应配合错误返回
}
return a / b, a % b
}
调用时可一次性接收多个返回值:
立即学习“go语言免费学习笔记(深入)”;
quotient, remainder := divide(10, 3) // quotient=3, remainder=1标准模式:返回结果与 error
Go 推崇“显式错误处理”,绝大多数 I/O 或可能失败的操作都采用 (result, error) 形式返回。error 是接口类型,通常用 errors.New 或 fmt.Errorf 构造。
- 成功时返回有效结果,error 为 nil
- 失败时结果可设为零值(如 0、""、nil),error 持有具体错误信息
- 调用方需检查 error 是否为 nil,再决定是否使用结果
data, err := os.ReadFile(filename)
if err != nil {
return nil, fmt.Errorf("failed to read %s: %w", filename, err)
}
return data, nil
}
// 调用示例
content, err := readFile("config.json")
if err != nil {
log.Fatal(err)
}
fmt.Println("Read", len(content), "bytes")
命名返回参数:提升可读性与 defer 支持
可在函数签名中为返回值命名,这样既增强代码可读性,又允许在函数体内直接赋值(无需重复写 return 值),还便于在 defer 中访问返回值。
func parseConfig(s string) (cfg map[string]string, err error) {cfg = make(map[string]string)
if s == "" {
err = errors.New("empty config string")
return // 等价于 return cfg, err
}
// 解析逻辑...
return // 返回当前 cfg 和 err 的值
}
注意:命名返回值会自动初始化为对应类型的零值(如 map 为 nil,string 为 "",error 为 nil),适合需要统一错误清理或日志记录的场景。
处理多个错误或多种结果的进阶技巧
当业务逻辑需返回多个非错误结果(如用户、权限、计数)加一个 error 时,保持顺序清晰即可:
func getUserWithStats(id int) (user User, permissions []string, loginCount int, err error) {user, err = db.FindUser(id)
if err != nil {
return
}
permissions, err = db.GetUserRoles(id)
if err != nil {
return
}
loginCount, err = db.GetLoginCount(id)
return
}
调用时建议用变量接收并明确用途,避免位置混淆:
u, perms, count, err := getUserWithStats(123)if err != nil {
handleError(err)
return
}
fmt.Printf("%s has %d roles and %d logins", u.Name, len(perms), count)
不复杂但容易忽略的是:始终优先检查 error;命名返回值慎用于导出函数(影响 API 清晰度);多个返回值不宜超过 4–5 个,否则建议封装为结构体。










