跳到主要内容

函数返回值

多返回值如何书写, return 有哪些匹配要求?​

  • multiple results: 函数可返回多个值;
  • 常见形式: (value, ok) 或 (value, error);
  • return: 返回值数量和类型必须匹配函数签名;
func div(a, b int) (int, bool) {
if b == 0 {
return 0, false // 使用 bool 表示除法是否成功
}
return a / b, true
}
value, ok := div(7, 2) // 调用方按签名接收两个结果
if ok {
println(value) // 3
}

具名返回值如何在函数返回时确定结果?​

  • named result: 返回值拥有名字;
  • named result 变量: 函数开始时创建, 并按类型零值初始化;
  • naked return: 不带表达式的 return, 返回具名结果的当前值;
  • 显式 return: 使用具名返回值时仍可显式返回表达式;
  • 使用建议: 短函数可用, 长函数慎用;
func split(sum int) (x int, y int) {
// x 和 y 是具名返回值,函数开始时已经存在,初始值均为 0
x = sum / 2 // x 是具名返回值,在函数体内作为局部变量使用
y = sum - x
return // naked return 返回 x 和 y 当前值
}

func splitExplicit(sum int) (x int, y int) {
// 使用具名返回值时,return 依旧可以显式返回表达式
return sum / 2, sum - sum/2
}
  • return 顺序: 显式 return 先给具名结果赋值,再执行 defer,最后把具名结果交还调用方;
func result() (n int) {
defer func() { n++ }()
return 1
}
// result() 返回 2,因为 defer 修改了具名结果 n。