Golang · 2023年3月7日 0

关于Golang的那些事(五) — 函数【】

函数包含连续的执行语句,可以在代码中通过调用函数来执行它们。函数能将复杂的逻辑转换为一块块的代码块,使得更具可读性,另外有一些公共的函数,可以让团队合作更加便利,在Golang当中,函数和Node.js稍微有一点点的不同,下面由我来讲解讲解。

首先是函数的声明,在Golang中函数的声明就类似强类型的node.js函数声明,func name(param list) (result-list) {/** body **/}, 形式参数列表指定了一组变量的参数名和参数类型,它们的实参由调用这个函数的调用方传递过来,返回类型稍微有点不同,在Golang里面除了没有返回值的函数,其他都要注明返回类型,另外它也支持多个返回值。函数的类型称作函数签名,当两个函数拥有相同的形参列表和返回列表时,我们就说他们的签名一样。每次我们调用的时候,参数要一一对应,顺序也要相同,Golang函数参数没有默认值的概念。

那么在Golang当中,函数如何处理错误呢?我们可以利用它可以有多个返回值的特性,将错误返回给调用方,我们习惯上,把错误的变量放在最后一个结果返回。如果错误只有一种情况,通常返回布尔值,比如在缓存当中取值,如果键值不存在就会返回错误,那我们就可以这样写:value,ok := cache.query(key), 如果ok是真就是正常返回了键值,如果ok是假就说明键值对不存在。错误只有一种的情况在现实的业务逻辑当中,其实很少,大部分都是一些未考虑到或者意外的错误,比如连接不上数据库,内存不足等等,这个时候我们通常将错误封装到最后一个返回值里面,调用方先查看这个错误存不存在,如果存在,先处理错误,如果不存在,就继续下面的逻辑,比如调用http的get请求获取信息,resp,err := http.get(url); if err != nil { return nil, err}; 。另外,对于错误,我们可以采用fmt.Errorf的fmt.Sprintf函数格式化错误信息并且返回一个新的错误值,我们把原始的错误消息不断添加上去,构成一个错误链条,当错误最终到达main函数的时候,就能得到一个清晰的从根本原因到总体故障的因果链。一种更加优雅的方式输出错误是自定义打印的格式,包含时间和日期、内容,只记录下错误,让程序继续运行,这样就减少了打断程序运行的频率。

在Golang当中,和Node.js一样,它还有一种很特殊的函数,叫做匿名函数。我们知道,命名函数只能在包级的作用域进行声明,但是匿名函数可以突破这个限制。比如下面这个平方函数:

func  squares()  func()  int {
    var x int
    return func() int {
        x++     
        return x * x    
    } 
}

当我们在main函数里面这样调用的时候,就会把x的作用域扩大了

func main() {

    f := squares() 

    fmt.Println(f()) // 1

     fmt.Println(f()) // 4

    fmt.Println(f())  // 9

    fmt.Println(f()) // 16    

}
打赏 赞(0) 分享'
分享到...
微信
支付宝
微信二维码图片

微信扫描二维码打赏

支付宝二维码图片

支付宝扫描二维码打赏