在 Go 语言中,函数调用完成后会产生一个返回值,该值的类型和数量取决于函数定义。返回值在函数调用结束时通过 return 语句返回,具体规则如下:
一. 返回值的基本规则
1.返回值类型:
- 返回值必须有类型,类型可以是内置类型(如 int、string)或自定义类型。
- 返回值本质上是函数中的局部变量,生命周期在函数执行结束后结束。
2.无返回值:
- 函数可以没有返回值,此时 return 语句可选。
- 示例:
func printMessage() {
fmt.Println("Hello, Go!")
return // 可省略
}
3.有返回值:
- 有返回值的函数必须使用 return 语句,并提供返回值。
- 示例:
func add(x, y int) int { // 返回值类型为 int
return x + y // 直接返回计算结果
}
4.匿名返回值的特点:
- 简洁,但不明确标识返回值的用途。
- 适合简单逻辑的函数。
注意事项
无返回值 func foo() {} 可省略或直接写 return 无法使用变量接收函数返回值
匿名返回值 func foo() int {} 必须写 return <值> 返回值由 return 明确提供
命名返回值(具名) func foo() (res int) {} return 可省略值,直接返回命名变量的当前值 返回值变量不可用 var 或 := 重新声明
多个返回值 func foo() (int, string) 返回值数量和顺序必须与定义一致 使用匿名或命名方式,根据需求灵活选择
命名返回值
1.单返回值
一旦一个函数有返回值,必须使用同样个数和类型变量接受
package main
import "fmt"
func f1(x int) (r int) { //r是当前f1函数的局部变量
// r:=1024 //错误,r不能重复定义,因为在f1返回值中已经定义过
r = x * 1024 // 重新给r进行赋值,使用参数计算返回值
return // 具名返回值时可以不带返回值变量的名称,Go自动匹配。等价于"return r"
}
func main() {
m1 := f1(10) //函数调用时,变量接收的个数和类型必须与函数返回值的个数和类型一致。
fmt.Println(m1)
}
2.多返回值
package main
import "fmt"
// t2 返回两个整数 i 和 j 的值
func t2() (i, j int) {
i, j = 4, 5
return // 使用具名返回值直接返回
}
func t1() (int, int) {
return 1, 2 // 匿名返回值
}
func main() {
// 调用 t1 并输出返回值
s1, s2 := t1()
fmt.Println("t1 返回值:", s1, s2)
// 调用 t2 并输出返回值
s3, s4 := t2()
fmt.Println("t2 返回值:", s3, s4)
}
package main
import "fmt"
func f2(a, b int) (result int, err error) { // result 和 err 是命名返回值
if b == 0 {
err = fmt.Errorf("f2 by zero")
return
}
result = a / b
return // 隐式返回 result 和 err
}
func main() {
res, err := f2(10, 2) // 调用f2函数,将 a=10 和 b=2 作为参数传入。
if err != nil { // err 专门用来作为err处理错误返回值,如果 err 不等于 nil,则说明发生了错误。因为在 Go 中,错误是通过一个类型为 error 的值传递的,nil 表示没有错误。
fmt.Println("Error:", err) //函数检测到错误,返回 res = 0 和错误 err = "f2 by zero"。
} else {
fmt.Println("Result:", res) // 如果为 nil有错误,输出结果 Result: 5,a实参和b实参相除 a/b==5。
}
}