1.函数
Go 里面有三种类型的函数:
1.普通的带有名字的函数
2.匿名函数或者lambda函数
3.方法
2.传递变长参数
func myFunc(a, b, arg ...int) {}
这个函数接受一个类似某个类型的 slice 的参数
例如:
func min(s ...int) int {}
x := min(1, 3, 2, 0)
slice := []int{7,9,3,5,1}
x = min(slice...)
变长参数可以作为对应类型的 slice 进行二次传递。
如果一个变长参数的类型没有被指定,则可以使用默认的空接口 interface{},这样就可以接受任何类型的参数
3.defer
关键字 defer 允许我们推迟到函数返回之前(或任意位置执行 return 语句之后)一刻才执行某个语句或函数
当有多个 defer 行为被注册时,它们会以逆序执行(类似栈,即后进先出
关键字 defer 允许我们进行一些函数执行完成后的收尾工作 :
1.关闭文件流
defer file.Close()
2.解锁一个加锁的资源
mu.Lock()
defer mu.Unlock()
3.打印最终报告
printHeader()
defer printFooter()
4.关闭数据库链接
defer disconnectFromDB()
5.使用 defer 语句实现代码追踪
6.使用 defer 语句来记录函数的参数与返回值
4.内置函数
https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.5.md
5.将函数作为参数
func main() {
callback(1, Add)
}
func Add(a, b int) {
fmt.Printf("The sum of %d and %d is :%d\n",a, b, a+b)
}
func callback(y int, f func(int,int)) {
f(y,2)
}
6.闭包
defer 语句和匿名函数
关键字 defer (详见第 6.4 节)经常配合匿名函数使用,它可以用于改变函数的命名返回值。
匿名函数还可以配合 go 关键字来作为 goroutine 使用(详见第 14 章和第 16.9 节)。
匿名函数同样被称之为闭包(函数式语言的术语):它们被允许调用定义在其它环境下的变量。闭包可使得某个函数捕捉到一些外部状态,例如:函数被创建时的状态。另一种表示方式为:一个闭包继承了函数所声明时的作用域。这种状态(作用域内的变量)都被共享到闭包的环境中,因此这些变量可以在闭包中被操作,直到被销毁,详见第 6.9 节中的示例。闭包经常被用作包装函数:它们会预先定义好 1 个或多个参数以用于包装,详见下一节中的示例。另一个不错的应用就是使用闭包来完成更加简洁的错误检查(详见第 16.10.2 节)
func Adder() func(int) int {
var x int // 只初始化一次
return func(delta int) int {
x += delta
return x
}
}
https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.8.md
http://www.runoob.com/go/go-functions.html