c语言编程笔录

首页 >   > 笔记大全

笔记大全

golang函数的返回值如何实现

更新时间:2024-01-04

1. 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 语句执行完毕后设置的,但函数的返回值也可以像往常一样覆盖。最后,函数也可以作为值传递,并且与其他类型一样可以被存储在接口变量中,该功能使得可以在运行时对函数进行编写并反射。