3.3 Go 返回值详解

在 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。
	}

}
相关推荐
thinkMoreAndDoMore30 分钟前
深度学习(3)-TensorFlow入门(常数张量和变量)
开发语言·人工智能·python
蓝桉8021 小时前
图片爬取案例
开发语言·数据库·python
逸狼1 小时前
【JavaEE进阶】Spring DI
java·开发语言
my_styles2 小时前
2025-alibaba-Sentinel组件
java·开发语言·sentinel
禁默2 小时前
C++之旅-C++11的深度剖析(1)
开发语言·c++
繁依Fanyi2 小时前
巧妙实现右键菜单功能,提升用户操作体验
开发语言·前端·javascript·vue.js·uni-app·harmonyos
程序员黄同学2 小时前
解释 Vue 中的虚拟 DOM,如何通过 Diff 算法最小化真实 DOM 更新次数?
开发语言·前端·javascript
~kiss~3 小时前
Rust~二刷异步逻辑
开发语言·后端·rust
SomeB1oody3 小时前
【Rust中级教程】2.7. API设计原则之灵活性(flexible) Pt.3:借用 vs. 拥有、`Cow`类型、可失败和阻塞的析构函数及解决办法
开发语言·后端·性能优化·rust
m0_748240253 小时前
python轻量级框架-flask
开发语言·python·flask