一、Go 返回参数命名
-
Golang允许在函数签名或定义中为函数的返回或结果参数指定名称。或者可以说这是函数定义中返回变量的显式命名。基本上,它解决了在return语句中提及变量名称的要求。 通过使用命名返回参数或命名参数,只能在函数末尾使用return关键字将结果返回给调用方。
-
当函数必须返回多个值时,通常使用此概念。 因此,为了使用户感到舒适并增强代码的可读性,Golang提供了此功能。
1、声明命名的返回参数
package main
import "fmt"
// Main Method
func main() {
//在这里调用函数
//函数返回两个值
m, d := calculator(105, 7)
fmt.Println("105 x 7 = ", m)
fmt.Println("105 / 7 = ", d)
}
// 具有命名参数的函数
func calculator(a, b int) (mul int, div int) {
//在这里,简单的赋值就可以
//并初始化它的值
mul = a * b
div = a / b
//这里有return关键字
//没有任何结果参数
return
}
2、重要事项
2.1、公共命名参数类型的函数
如果所有命名的返回参数的类型是公共的或相同的,则可以指定公共数据类型。将下面的代码与上面阅读的示例进行比较,以便更好地理解。
//有命名参数的函数
func calculator(a, b int) (mul, div int) {
2.2、增加可读性
使用命名返回参数将增强代码的可读性,因为只需读取函数签名就可以知道返回参数。
2.3、使用“裸返”
使用命名的返回参数后,return语句通常称为"裸返"。
如下的return
func calculator(a, b int) (mul int, div int) {
//在这里,简单的赋值就可以
//并初始化它的值
mul = a * b
div = a / b
//这里有return关键字
//没有任何结果参数
return
}
2.4、返回变量默认零值
默认情况下,Golang用零值定义所有命名变量,函数将能够使用它们。如果函数未修改值,则将自动返回零值
2.5、不要重复赋值
如果您将使用短声明运算符(:=)初始化命名的返回参数,则将给出错误,因为它们已被Go编译器初始化。因此,您可以使用简单的赋值方式(=)将值分配给命名的返回参数。
//具有命名参数的函数
func calculator(a, b int) (mul int, div int) {
//在这里,它将抛出一个错误
//因为已经定义了参数
//在函数签名中
mul := a * b
div := a / b
//这里有return关键字
//没有任何结果参数
return
}
编译都不通过,goland中直接爆红
二、裸返 应用场景
1、与defer使用
1.1、错误示例
下面代码返回什么?
知识点:goland中return不是一个原子操作
package main
import "fmt"
func test01() (result int) {
defer func() {
result++
}()
return 0
}
func main() {
fmt.Println(test01())
}
1.2、正确示例
func f() (result int) {
result = 0 //return语句不是一条原子调用,return xxx其实是赋值+ret指令
func() { //defer被插入到return之前执行,也就是赋返回值和ret指令之间
result++
}()
return
}