Golang基础(五)——函数二

Golang基础(五)——函数二

@([07] golang)[Go总结]

匿名函数

匿名函数就是将一个函数直接赋值给一个变量,这个函数没有函数名,所以叫匿名函数。

代码实例
package main

import "fmt"

func main() {
    // 这里定义了一个匿名函数,且赋值给a
    a := func(i int, j int) (int, int) {
        return j, i
    }
    fmt.Println(a(3,4))

}

闭包

Go的闭包: 可以简单理解为一个函数返回了一个匿名函数。

代码实例
package main

import "fmt"

// 定义一个闭包函数
func a(i int) func(x int) int {
    return func(x int) int {
        return i + x
    }
}

func main() {
    // 将a(10)赋值给num,即num := func(x int) int{return 10+x}
    num := a(10)
    //这里每次都是做10+x的计算
    fmt.Println(num(1))
    fmt.Println(num(2))
    fmt.Println(num(3))
}

运行结果:

11
12
13

defer(延迟函数)

defer语句时一种延迟执行的语句,在函数中可以添加多个defer语句,当函数执行到最后时,会逆序执行defer 语句操作。可以理解为在函数执行时遇到defer语句先将语句放入一个堆栈中,当函数执行结束时从堆栈中一条条取出defer语句执行。

defer 主要用于资源的管理和回收。
无论发生任何错误已经defer的语句都会照常执行。

代码实例
package main

import "fmt"
import "os"

func main() {
    f := createFile("tmp/defer.txt")
    // 在打开文件的位置调用defer函数,保证文件一定会被关闭
    defer closeFile(f)
    writeFile(f)
}
func createFile(p string) *os.File {
    fmt.Println("creating")
    f, err := os.Create(p)
    // 这里用到了panic函数,如果在打开文件时发生错误就会中断函数
    if err != nil {
        panic(err)
    }
    return f
}
func writeFile(f *os.File) {
    fmt.Println("writing")
    fmt.Fprintln(f, "data")
}
func closeFile(f *os.File) {
    fmt.Println("closeing")
    f.Close()
}

Panic函数

Go的一个异常处理函数,可以中断函数的控制流程,让函数进入“恐慌"状态。但函数中的延迟函数还是会正常执行(前提是处于panic之前的延迟函数)。

代码实例
package main

import "fmt"

func main() {
    a()
    b()
    c()
}

func c() {
    fmt.Println("func c")
}
func b() {
    panic("panic in b")
}
func a() {
    fmt.Println("func a")
}

Recover函数

与Panic相对应的函数,可以将处于恐慌的goroutine恢复,recover函数只有在延迟函数中才可以正常生效,在函数正常执行的过程中,调用recover函数回返回nil,但如果当前goroutine陷入恐慌,调用recover可以捕获到panic的函数值,并且恢复后续正常的执行。

代码实例
package main

import "fmt"

func main() {
    a()
    b()
    c()
}

func c() {
    fmt.Println("func c")
}
func b() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("Recover in B")
        }
    }()
    panic("panic in b")
}
func a() {
    fmt.Println("func a")
}

你可能感兴趣的:(Golang基础(五)——函数二)