Go 中的函数重载是被禁止的,即不能通过不同的参数传递执行同名函数的不同功能。
Go 中没有泛型的概念,因此它不支持那种支持多种类型的函数,不过大部分情况可以使用 interface 跟反射来实现相似的功能。
如果某个函数的最后一个参数采用 ...type 的形式,那么这个函数就可以用来处理一个变长的参数,这个长度可以是 0,这样的函数称为变参函数。
func SampleFunc(prefix string, who ...string)
SampleFunc("Hello", "world1", "world2", "world3")
关键字 defer 允许在 函数执行完之前或 return 执行完之后 推迟执行某一段代码,类似于其它语言中的 finally 关键字。
当有多个 defer 行为被注册时,它们会逆序执行(类似于栈)
名称 | 说明 |
---|---|
close | 用于关闭管道通信 |
len | 返回某个类型的长度或者数量(string, list, slice, map, channel) |
cap | 返回某个类型的最大容量(map, channel) |
new | new 用于值类型和用户定义的类型 |
make | make 用于内置引用类型(slice, map, channel) |
copy | 复制 |
append | 连接切片 |
panic | 错误处理 |
recover | 错误处理 |
当为了实现一个简单的函数的时候,可以在函数体中对一个函数进行不命名的定义。
lambdaFunc := func (x, y int) int {
return x+y
}
lambdaFunc(1, 2)
或者可以直接调用 lambda 函数
func (x, y int) int {
return x+y
}(1, 2)
一个返回值为另一个函数的函数可以称为工厂函数,在需要创建一系列相似的函数的时候很有用处。在 Python 中被称为高阶函数或者装饰器。如下:
func MakeAddSuffix(suffix string) func(string) string {
return func (name string) string {
if !string.HasSuffix(name, suffix){
return name + suffix
}
return name
}
}
addTxt := MakeAddSuffix(".txt")
addTxt("test") // test.txt