函数 function

-Go 函数不支持 嵌套,重载 和 默认函数
-但支持一下特性:
    无需声明原型,不定长度变参,多返回值,命名返回值参数,匿名函数,闭包
-定义函数使用关键字 func ,且左大括号不能另起一行
-函数也可以作为一种类型使用

  1. //基本结构
  2. func A(a int, b int, c string) {
  3. //...
  4. }
  5. //自定义返回值
  6. func A(a int, b int, c string) (int, int) {
  7. //...
  8. }
  9. //不定长变参,传进来的数据插入a这个slice
  10. func A(a ...int) {
  11. fmt.Println(a)
  12. }
  13. //不定长变参只能写在最后
  14. func A(b string, a ...int) {
  15. fmt.Println(a)
  16. }

函数作为类型使用

  1. func main() {
  2. a := A
  3. a()
  4. }
  5. func A() {
  6. fmt.Println("Func A")
  7. }

匿名函数

  1. func main() {
  2. a := func() {
  3. fmt.Println("Func A")
  4. }
  5. a()
  6. }

闭包

  1. func main() {
  2. f := closure(10)
  3. // 11
  4. fmt.Println(f(1))
  5. }
  6. func closure(x int) func(int) int {
  7. return func(y int) int{
  8. return x + y
  9. }
  10. }

延迟调用函数 defer

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

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

  1. //打印结果为 2 1 0
  2. for i := 0; i < 3; i++ {
  3. defer fmt.Println(i)
  4. }
  5. //调用函数 打印结果为 3 3 3
  6. for i := 0; i < 3; i++ {
  7. defer func () {
  8. fmt.Println(i)
  9. }()
  10. }

捕获异常

  1. func main() {
  2. A()
  3. B()
  4. C()
  5. }
  6. func A() {
  7. fmt.Println("A")
  8. }
  9. func B() {
  10. //捕获
  11. defer func() {
  12. if err := recover(); err != nil {
  13. fmt.Println("Recover in B")
  14. }
  15. }()
  16. panic("B")
  17. }
  18. func C() {
  19. fmt.Println("C")
  20. }