函数返回值
“_”标识符,用来忽略函数的某个返回值
Go 的返回值可以被命名,并且就像在函数体开头声明的变量那样使用。
返回值的名称应当具有一定的意义,可以作为文档使用。
没有参数的 return 语句返回各个返回变量的当前值。这种用法被称作“裸”返回。
直接返回语句仅应当用在像下面这样的短函数中。在长的函数中它们会影响代码的可读性。
package mainimport ("fmt")func add(a, b int) (c int) {c = a + breturn}func calc(a, b int) (sum int, avg int) {sum = a + bavg = (a + b) / 2return}func main() {var a, b int = 1, 2c := add(a, b)sum, avg := calc(a, b)fmt.Println(a, b, c, sum, avg)}
输出结果:
1 2 3 3 1
Golang返回值不能用容器对象接收多返回值。只能用多个变量,或 “_” 忽略。
package mainfunc test() (int, int) {return 1, 2}func main() {// s := make([]int, 2)// s = test() // Error: multiple-value test() in single-value contextx, _ := test()println(x)}
输出结果:
1
多返回值可直接作为其他函数调用实参。
package mainfunc test() (int, int) {return 1, 2}func add(x, y int) int {return x + y}func sum(n ...int) int {var x intfor _, i := range n {x += i}return x}func main() {println(add(test()))println(sum(test()))}
输出结果:
3 3
命名返回参数可看做与形参类似的局部变量,最后由 return 隐式返回。
package mainfunc add(x, y int) (z int) {z = x + yreturn}func main() {println(add(1, 2))}
输出结果:
3
命名返回参数可被同名局部变量遮蔽,此时需要显式返回。
func add(x, y int) (z int) {{ // 不能在一个级别,引发 "z redeclared in this block" 错误。var z = x + y// return // Error: z is shadowed during returnreturn z // 必须显式返回。}}
命名返回参数允许 defer 延迟调用通过闭包读取和修改。
package mainfunc add(x, y int) (z int) {defer func() {z += 100}()z = x + yreturn}func main() {println(add(1, 2))}
输出结果:
103
显式 return 返回前,会先修改命名返回参数。
package mainfunc add(x, y int) (z int) {defer func() {println(z) // 输出: 203}()z = x + yreturn z + 200 // 执行顺序: (z = z + 200) -> (call defer) -> (return)}func main() {println(add(1, 2)) // 输出: 203}
输出结果: 203
203
