Go 中各种函数

167 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情

GO 中的函数可以划分为有返回值和无返回值两种类型。 基本的模式如下所示:

func funcName(param1 T, param2 T){}
// 有返回值
func funcName(param1 T, param2 T) T{}

普通函数

第一种类型是具有返回值的函数的最简单版本。 这个函数称为 simpleFunc,它接受 2 个整数 x 和 y 作为参数,并返回这 2 个数字的总和作为结果。

func simpleFunc(x int, y int) int {
    z := x + y
    return z
}

有命名的函数

在这种类型中,返回的值是预先命名的。 除此之外,它类似于第一种方法

func namedFunc(x, y int) (z int) {
    z = x + y
    return
}

多个返回值

GO 的一个有趣特性是能够从函数返回多个值。 这个例子证明了这一点。 在这种情况下,3 个数字被传递给名为 multiValues 的函数,它们被平方并立即返回所有结果!

func multiValues(x, y, z int) (int, int, int) {
    ...
    return x,y,z
}

请注意,返回类型指定为 (int, int, int) 以表明此函数一次返回 3 个值。如果给每个返回值都加上命名,那就是返回带有名称的返回值。

可变函数

像 C# 语言中可变数量的参数一样,即称为是可变参数的函数。在这种情况下,函数 variadicFunc 接受可变数量的整数,由 nums …int 表示。 GO 中的“...”表示一个范围,在这种情况下是一个整数范围。

func variadicFunc(nums ...int) int {
    res := 0
    for _, n := range nums {
        res += n
    }
    return res
}

因为参数是可变数量的,是一定数量的参数个数,所以这里可以使用 for 循环对变量进行操作。

作用于结构的函数

GO 函数可以返回函数以及类似于变量。 在 C# 语言中,您可以将其视为委托函数,即 Action 或 Func<T, V>。

func getAreaFunc() func(int, int) int {
    return func(x int, y int) int {
        return x * y
    }
}


func main(){
    aaa := getAreaFunc()
    result := aaa(4,5)
}

需要注意这里是会返回一个函数。 即 func(int, int) int。 一个接受 2 个整数并返回一个整数的函数。 返回的函数不包含名称。

匿名函数

GO 也支持同时定义和调用的匿名函数。 在这种情况下,一个函数简单地打印一条消息,定义并立马调用!

func main(){
    func(){
     // do somthing
    }()
}

延迟函数

和关键字 defer 一起使用。 defer 关键字用于标识在函数运行完成后必须运行的内容。

func main(){
   defer sayBye() 
 fmt.Println("hi, my name is tom")
}

func sayBye(){
    fmt.Println(" bye")
}

异步函数

和关键字 go 一起使用,实现一个异步函数。就像 c#中的 async/await 模式创建出来的异步代码。

go func(){
     fmt.Println(" hi")
}()

函数有很多,根据不同的业务功能使用不同的函数。函数在接收不同的参数也会发挥不同的功能。比如传递参数为指针、切片、引用(像 Map 类型)。也支持使用函数作为参数进行传递。

还有一个复杂的函数类型:闭包函数。GO 中的闭包是匿名函数,也可以自动保存对在其主体之外定义的变量的引用。

func closureFunc() func() int {
    ...
    return func() int {
        return 0
    }
}