匿名结构体的基本使用
package main
func main() {
// --- function variable ---
fn := func() { println("Hello, World!") }
fn()
// --- function collection ---
fns := [](func(x int) int){
func(x int) int { return x + 1 },
func(x int) int { return x + 2 },
}
println(fns[0](100))
// --- function as field ---
d := struct {
fn func() string
}{
fn: func() string { return "Hello, World!" },
}
println(d.fn())
// --- channel of function ---
fc := make(chan func() string, 2)
fc <- func() string { return "Hello, World!" }
println((<-fc)())
}
defer
在函数中,程序员经常需要创建资源,为了在函数执行完毕后,及时的释放资源,go的设计者提供了defer关键字
defer特性:
1. 关键字 defer 用于注册延迟调用。
2. 这些调用直到 return 前才被执。因此,可以用来做资源清理。
3. 多个defer语句,按先进后出的方式执行。
4. defer语句中的变量,在defer声明时就决定了。
defer用途:
1. 关闭文件句柄
2. 锁资源释放
3. 数据库连接释放
栈的特点是先进后出
如果你想关闭某个使用的资源,在使用的时候随手defer,因为defer有延迟执行机制(函数执行完毕再执行defer压入栈的语句)
闭包
func getSum() func (int) int{
var sum int = 10
return func (num int) int{
sum += num return sum
}
}
func main() {
f := getSum()
f(1)//11
f(2)//13 ?
f(3)//16
}
匿名函数中引用的变量会一直保存在内存中,可以一直使用
闭包的本质:
闭包本质上依旧是一个匿名函数,只是这个函数引入外界的变量/参数
匿名函数+引用的变量/参数 = 闭包
闭包中使用的变量/参数会一直保存在内存中,比较占用内存