Go语言基础学习 (四) - Go语言函数简单介绍

182 阅读2分钟

前言

在极客上看了蔡超老师的Go语言课程 随手记下来的一些随笔,Go的基础应用及实例, 系列内容比较偏基础,推荐给想要入门Go语言开发者们阅读。

目录如下

Go语言基础学习 (一) - 变量 常量已经与其他语言的差异
Go语言基础学习 (二) -Go语言中的类型转与Go语言中的数组切片
Go语言基础学习 (三) - Go语言内的 Map声明使用与工厂模式
Go语言基础学习 (四) - Go语言函数简单介绍
Go语言基础学习 (五) - 面向对象编程
Go语言基础学习 (六) - 编写一个好的错误处理
Go语言基础学习 (七) - 包(package)
Go语言基础学习 (八) - 并发编程

  • Go语言内的函数与其他语言的差异

    image-20220214171741946.png

    一个简单的例子

    func returnMultiValues(b int,a int)(int,int)  {  // 定义一个函数,并定义函数的返回值类型
           return rand.Intn(b),rand.Intn(a)
    }
    
    func TestFn( t *testing.T)  {
           a,b := returnMultiValues(10,1)
           t.Log(a,b)
    }
    

    使用装饰性函数来创建一个获取一个函数的运行时间,类似于面向对象的装饰性函数

    func TestFn( t *testing.T)  {
     tsFS := timeSpent(slowFun) // 返回新的函数
     t.Log(tsFS(10))  // 包装后的函数
     }
    
    
    
     func slowFun(op int) int  {
             time.Sleep(time.Second *2)
             return op
     }
    
     //. inner 为匿名函数  
     func timeSpent(inner func(op int) int )  func(op int)int  {
     // 在函数下在包一层写执行代码
             return func(n int) int {
                     start := time.Now()
                     ret   := inner(n)  // 获取匿名函数的执行结果,最后return出匿名函数的结果
                     fmt.Println("time spent:",time.Since(start).Seconds())
                     return ret
             }
     }
    

    函数可变参数

    func TestVarParam( t * testing.T)  {
     t.Log(Sum(1,2,3))  // 结果为所有参数所相加的和
     }
    
     func Sum(ops ... int) int {  // 使用 ... 来代表参数为多个
             ret := 0
             for  _,k := range ops {
                     ret += k
             }
             return ret  
     }
    
    
  • defer函数

    在函数中,程序员经常需要创建资源(比如:数据库连接、文件句柄、锁等) ,为了在函数执行完毕后,及时的释放资源,Go 的设计者提供 defer (延时机制)。

    func Clear()  {
    fmt.Println("Clear resources.")
    }
    
    func TestDefer(t * testing.T)  {
           defer Clear()
           fmt.Println("Start")
    
    }
    

    运行结果
    Start
    Clear resources.

    defer 函数调用的执行时机是外层函数设置返回值之后, 并且在即将返回之前