golang函数的返回值如何实现
更新时间:2024-01-041. Golang函数的返回值
Golang函数的返回值可以是任何数据类型。多返回值特性是 Go 语言比其它语言更强大的方面之一,它使得我们能够运用少量的代码操作多个返回值的情况。当然,函数只能返回一种类型数据的特例除外。
/** * 以函数的计算为例子说明函数返回值的用法 **/ package main import "fmt" func multiply(a, b int) (int, int) { return a * b, a + b } func main() { prod, sum := multiply(2, 3) fmt.Println(prod) // 6 fmt.Println(sum) // 5 }
2. 命名返回值
函数还可以定义命名返回值。在这种情况下,函数返回的结果变量(仍然可以是多个)仅在函数声明中起作用。实际上,您可以将函数声明看作是: func functionName() (returnVariable, returnVariable2 dataType, ...){ … }
编译器为命名返回值添加一个隐式返回语句,因此您可以在函数中省略显式返回语句,因为编译器会自动将其添加到函数的结尾处。return 语句没有参数时,它返回所有命名返回的变量。
/** * 命名返回值的示例 **/ package main import "fmt" func multiply(a, b int) (prod int, sum int) { prod = a * b sum = a + b return // 有效,prod和sum将自动被返回 } func main() { a, b := 2, 3 prod, sum := multiply(a, b) fmt.Println(prod, sum) // 6 5 }
3.defer 返回值
当函数有命名返回值时, defer语句可以修改这些返回值。函数的返回值是在 defer 的语句执行完毕后设置的。函数的返回值也可以像往常一样覆盖,这样它们不会受到 defer 语句的影响。
/** * Defer 返回值的示例 **/ package main import "fmt" func multiply(a, b int) (prod int) { prod = a * b defer func() { prod += 1000 }() return prod } func main() { a, b := 2, 3 fmt.Println(multiply(a,b)) // 6 + 1000 = 1006 }
4. Golang函数和接口
在 Go 中,函数也可以作为值传递,并且与其他类型一样可以被存储在接口变量中。该功能使得可以在运行时对函数进行编写并反射。
/** * 声明一个接口 **/ package main import "fmt" type myFuncType func(int, int) int func add(x, y int) int { return x + y } func sub(x, y int) int { return x - y } func dummyFunc(x, y int) int { return 0 } func main() { var fn myFuncType fn = add fmt.Println(fn(2, 3)) fn = sub fmt.Println(fn(2, 3)) fn = dummyFunc fmt.Println(fn(2, 3)) } // 输出 // 5 // -1 // 0
总结
Golang函数允许有多个返回值,多返回值特性是Go语言比其他语言更强大的方面之一。函数还可以定义命名返回值,编译器为命名返回值添加一个隐式返回语句,因此您可以在函数中省略显式返回语句,因为编译器会自动将其添加到函数的结尾处。 defer语句可以修改命名返回值。函数的返回值是在 defer 语句执行完毕后设置的,但函数的返回值也可以像往常一样覆盖。最后,函数也可以作为值传递,并且与其他类型一样可以被存储在接口变量中,该功能使得可以在运行时对函数进行编写并反射。