0Pricing
Go Academy · 课时

多个返回值

返回元组与错误处理模式

多个返回值 是 CoddyKit 上的免费 Go Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。

为什么需要多返回值?

Go 函数可以返回多个值,因此不需要输出参数或异常。最常见的模式是同时返回结果和错误:

func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}

处理多返回值

调用方会以元组形式接收所有返回值。对于不需要的值,请使用 _ 将其丢弃:

result, err := divide(10, 3)
if err != nil {
    log.Fatal(err)
}
fmt.Println(result)

value, _ := divide(8, 2) // discard error

命名返回值

可以为返回值命名,使其成为函数内部的变量:

func minMax(nums []int) (min, max int) {
    min, max = nums[0], nums[0]
    for _, n := range nums[1:] {
        if n < min { min = n }
        if n > max { max = n }
    }
    return // naked return
}

裸返回值

不带参数的 return 会返回命名的返回变量。请谨慎使用——仅适用于名称本身就能清楚表达含义的短函数:

  • 短函数:可以接受
  • 长函数:会降低可读性——请优先使用显式返回

(值,错误)模式

Go 中惯用的错误处理模式:

func readConfig(path string) (Config, error) {
    data, err := os.ReadFile(path)
    if err != nil {
        return Config{}, fmt.Errorf("read config: %w", err)
    }
    var cfg Config
    return cfg, json.Unmarshal(data, &cfg)
}

切勿忽略错误

使用 _ 忽略错误很危险。最佳实践包括:

  • 检查每个错误,除非有明确理由不这样做
  • 使用 fmt.Errorf("op: %w", err) 为错误添加上下文
  • 仅在程序边界处使用 log.Fatal 或 panic,不要在库的深层代码中使用

三值返回

有些函数会返回三个值,不过这种情况并不常见:

func parseIPPort(s string) (ip string, port int, err error) {
    // ... parsing logic
    return
}

返回结构体还是多个值

以下是选择返回结构体还是多个值的时机:

  • 2~3 个紧密相关的值:可以使用多个返回值
  • 4 个或更多值,或包含可选字段:请使用结构体
  • (值,错误)模式:始终使用多个返回值

为已有变量赋值

为调用前已声明的变量赋值时,请使用 =,而不是 :=:

var cfg Config
var err error
cfg, err = loadConfig()
if err != nil { ... }

方法链中的多个返回值

Go 不支持直接对多个返回值进行方法链调用(不同于 Rust 的 Result.map)。请使用中间变量,在每一步处理错误:

data, err := fetchData(url)
if err != nil { return err }
parsed, err := parseData(data)
if err != nil { return err }
return save(parsed)

快速检查

在 Go 中,裸返回会执行什么操作?

回顾:多个返回值

多个返回值是 Go 的核心惯用写法:

  • 函数可以在括号括起的列表中返回多个值
  • (值,错误)模式随处可见——请始终检查错误
  • 命名返回变量支持裸返回(请谨慎使用)
  • 使用 _ 丢弃不需要的值
  • 相比输出参数,优先使用多个返回值,以便构建更清晰的接口

下一节:可变参数函数。

常见问题解答

「多个返回值」课时是免费的吗?

是的 — 「多个返回值」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。

「多个返回值」这节课中我会学到什么?

返回元组与错误处理模式 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Go Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「多个返回值」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Go Academy 课中编写并运行代码吗?

能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 函数基础与签名
  2. 多个返回值
  3. 可变参数函数
  4. defer、匿名函数与闭包
← 返回 Go Academy