GO语言补充(三)

函数function

Go 函数 不支持 嵌套、重载和默认参数
但支持以下特性:

无需声明原型、不定长度变参、多返回值、命名返回值参数
匿名函数、闭包

定义函数使用关键字 func,且左大括号不能另起一行
函数也可以作为一种类型使用

声明格式:

func 函数名(形参列表)(返回值列表){
    函数内容;
    return 返回值列表;

}

值得回味的就是,同样支持,不定长参数的写法,如下:

func A(a ... int){
    fmt.Println(a);
}

注意,有个硬性规定,就是使用不定长变参的时候需要将其放在参数列表的末尾位置。

不定长参数传递的是值拷贝;切片参数传递的是引用拷贝,地址拷贝。

GO语言当中一切皆类型。

匿名函数,就是省去为函数命名的过程,将整个函数直接赋值给一个变量。

闭包函数不太了解,下来记得补充知识。


defer

执行方式类似其它语言中的析构函数,在函数体执行结束后
按照调用顺序的相反顺序逐个执行
即使函数发生严重错误也会执行
支持匿名函数的调用
常用于资源清理、文件关闭、解锁以及记录时间等操作
通过与匿名函数配合可在return之后修改函数计算结果
如果函数体内某个变量作为defer时匿名函数的参数,则在定义defer
时即已经获得了拷贝,否则则是引用某个变量的地址

Go 没有异常机制,但有 panic/recover 模式来处理错误
Panic 可以在任何地方引发,但recover只有在defer调用的函数中有效


![这里写图片描述](https://img-blog.csdn.net/20171217224243368?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWluZ2h1b2Fp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![这里写图片描述](https://img-blog.csdn.net/20171217224337669?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWluZ2h1b2Fp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)