当前位置: 首页 > article >正文

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

}

http://www.kler.cn/a/517037.html

相关文章:

  • 洛谷刷题1-3
  • DAY6,使用互斥锁 和 信号量分别实现5个线程之间的同步
  • 算法竞赛之离散化技巧 python
  • 编程题-两数相加(中等)
  • 嵌入式硬件篇---ADC模拟-数字转换
  • Mysql面试题----为什么B+树比B树更适合实现数据库索引
  • ansible 批量按用户名创建kerberos主体,并分发到远程主机
  • docker 部署 java 项目详解
  • GL C++显示相机YUV视频数据使用帧缓冲FBO后期处理,实现滤镜功能。
  • Python网络爬虫中的编码乱码如何解决
  • SpringBoot使用Kafka如何保证消息不丢失
  • Qt中的connect函数
  • mysql学习笔记-数据库的设计规范
  • 在Qt中实现点击一个界面上的按钮弹窗到另一个界面
  • Xcode各个历史版本下载地址
  • 一文速通stack和queue的理解与使用
  • 根据条件更改el-tree的字体颜色
  • 【物联网】ARM核常用指令(详解):数据传送、计算、位运算、比较、跳转、内存访问、CPSR/SPSR、流水线及伪指令
  • Linux探秘坊-------4.进度条小程序
  • 基于微信小程序的汽车保养系统设计与实现(LW+源码+讲解)
  • 关于单通道串口服务器的详细讲解
  • uniapp APP端页面触发调用webview(页面为uniapp开发的H5)里的方法
  • 速通Docker === Docker Compose
  • WebAssembly视频检测在社区创作平台的落地与实践 | 得物技术
  • 设计模式的艺术-职责链模式
  • 解决npm install总是卡在sill idealTree buildDeps不动问题