
在函数声明阶段,我们把参数列表中的参数叫做形式参数,在函数体中,我们使用的都是形参;在函数实际调用时传入的参数被称为实际参数

Go 语言中,函数参数传递采用是值传递的方式。所谓“值传递”,就是将实际参数在内存中的表示逐位拷贝(Bitwise Copy)到形式参数中
闭包本质上就是一个匿名函数或叫函数字面值,它们可以引用它的包裹函数,也就是创建它们的函数中定义的变量。然后,这些变量在包裹函数和匿名函数之间共享,只要闭包可以被访问,这些共享的变量就会继续存在
每个函数声明定义的函数仅仅是对应的函数类型的一个实例,就像var a int = 13这个变量声明语句中的a,只是int类型的一个实例一样
函数需要对所有输入的参数行合法性的检查。一旦发现问题,立即终止函数的执行,返回预设的错误
在我们的函数实现中,也会调用标准库或第三方包提供的函数或方法。对于这些调用,我们不能假定它一定会成功,我们一定要显式地检查这些调用返回的错误值。一旦发现错误,要及时终止函数执行,防止错误继续传播
panic指的是go程序在运行时出现的一个异常情况。如果出现异常了,但没有被捕获并恢复,go程序的执行就会被终止,即便出现异常的位置不在主goroutine中也会这样
func bar() {
defer func() {
if e := recover(); e != nil {
fmt.Println("recover the panic:", e)
}
}()
println("call bar")
panic("panic occurs in bar")
zoo()
println("exit bar")
}
recover 是 Go 内置的专门用于恢复 panic 的函数,它必须被放在一个 defer 函数中才能生效。如果 recover 捕捉到 panic,它就会返回以 panic 的具体内容为错误上下文信息的错误值。如果没有 panic 发生,那么 recover 将返回 nil。而且,如果 panic 被 recover 捕捉到,panic 引发的 panicking 过程就会停止
defer是go语言提供的一种延迟调用机制,defer的运作离不开函数

对于自定义的函数或方法,defer 可以给与无条件的支持,但是对于有返回值的自定义函数或方法,返回值会在 deferred 函数被调度执行的时候被自动丢弃
defer关键字后面的表达式,是在将deferred函数注册到deferred函数栈的时候进行求值的