持续创作,加速成长!这是我参与「掘金日新计划 · 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
}
}