Golang 命名返回值和普通返回值
1、概述
在Go语言中,函数可以有命名返回值和普通(匿名)返回值。命名返回值会被视为定义在函数顶部的变量,并且在使用 return 语句返回时,不再必须在其后面指定参数名,也就是支持“裸”返回;而使用普通返回值时,使用 return 语句返回时,需要在其后面指定与普通返回值相同类型的参数名。
实际上,命名返回值和普通返回值都有其适用的场景,本文我们介绍 Golang 语言函数或方法使用命名返回值和普通返回值各自的“好处”与“坏处”。
2、命名返回值
使用命名返回值的“好处”是可以提升代码可读性,读者朋友们试想一下,当函数或方法有多个返回值时,尤其是函数体中代码比较长的函数或方法,如果我们使用普通返回值,那么我们想要知道返回值的含义,就需要先阅读函数体中完整代码。
而如果使用具有实际含义的命名返回值,我们只需要阅读函数或方法的签名,就可以知道其含义,甚至可以把它们作为文档使用。
但是,命名返回值也不是没有“坏处”,如果函数体内有变量与命名返回值同名,那么命名返回值会被覆盖,所以我们也需要注意避免“踩坑”。
3、普通返回值
普通(匿名)返回值的“好处”是简洁,当我们写一些简短函数或方法时,使用普通返回值可以使代码更加简洁,在 Golang 语言官方标准库中,有很多使用普通返回值的函数或方法。
func add(a, b int) int { return a + b }
但是如果返回值是指针类型时,使用普通返回值,就会使我们函数体中的代码变得不优雅,比如以下这段示例代码。
func c() *int { i := 0 return &i }
当然这里列举的代码片段是个极端示例,我们在编写 Golang 代码时,也并不会这么使用。还有就是在编写函数体代码比较长的函数时,使用普通返回值的代码,其可读性比不上使用命名返回值的代码。
4、总结
在Go语言中,推荐使用命名返回值(named return values)而不是普通返回值(unnamed return values),因为使用命名返回值可以提供一些优势:
-
可读性和可维护性:命名返回值可以让函数的返回值更加清晰和自文档化,因为你可以为返回值命名,使得在函数签名中可以看到每个返回值的含义,这有助于提高代码的可读性和可维护性。
-
默认值:命名返回值在函数开始时会被自动初始化为其类型的零值。这可以减少在函数中显式初始化返回值的需要,提高代码的简洁性。
-
减少错误:使用命名返回值可以减少返回值的顺序错误。如果一个函数有多个返回值,并且它们没有命名,那么容易在返回值的顺序上出现错误。而使用命名返回值,你可以直接通过名称引用它们,不容易出错。
尽管使用命名返回值具有上述优势,但在某些情况下,使用普通返回值可能更合适。例如,当函数只有一个返回值,并且返回值的含义非常明确时,使用普通返回值可能更简单和清晰。此外,如果你希望在函数体内的不同位置多次使用相同的返回值变量,普通返回值可能更合适。
总的来说,Go语言鼓励使用命名返回值,因为它可以提高代码的可读性、可维护性,并减少潜在的错误。但在一些简单的情况下,普通返回值也可以使用。选择哪种方式应根据具体的情况和代码的清晰度来决定。