Go语言从设计之初就将函数多返回值作为核心特性之一,它让函数可以自然地同时返回业务数据与错误信息,而不必借助全局变量或复杂结构体包装。这种机制在日常开发中极为常见,也是Go代码风格的重要组成部分。

多返回值的基础语法
在Go中,函数可以使用括号包裹多个返回类型,调用时通过赋值语句接收。下面是一个简单的示例:
package main
import (
"fmt"
)
// 返回和与乘积
func calc(a int, b int) (int, int) {
return a + b, a * b
}
func main() {
sum, product := calc(3, 4)
fmt.Println("sum:", sum, "product:", product)
}
上述代码中,calc函数返回两个int值,调用处使用两个变量接收,这是最直观的多返回值用法。
结合error处理返回值
Go语言惯例是使用最后一个返回值传递error,调用方必须显式检查。忽略error是常见错误来源。
package main
import (
"errors"
"fmt"
)
func divide(a float64, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil
}
func main() {
result, err := divide(10, 0)
if err != nil {
fmt.Println("error:", err)
return
}
fmt.Println("result:", result)
}
使用空白标识符忽略值
当某个返回值不需要时,可以用下划线_忽略,但error通常不应被忽略。
result, _ := divide(10, 2) fmt.Println(result)
命名返回值与defer
Go支持命名返回值,在函数中可直接修改,并通过defer在返回前处理。
package main
import "fmt"
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
func main() {
fmt.Println(split(17))
}
多返回值的实践建议
- 将error放在返回值最后一位,符合社区习惯
- 不要忽略error,至少记录日志
- 返回值过多时,可合并为结构体提升可读性
- 利用命名返回值简化defer中的逻辑
| 场景 | 推荐写法 |
|---|---|
| 数据查询 | (data, error) |
| 多数据计算 | (a, b, error) |
| 状态与信息 | (status, msg, error) |
多返回值不是越多越好,清晰与可维护才是目标。
总结
理解Go语言函数多返回值,重点在于掌握其与error的配合方式,以及合理组织返回内容。通过基础语法、命名返回值和defer的结合,可写出简洁稳健的代码。