关于Golang的那些事(五) -- 函数

llkevin13579 · · 428 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

       函数包含连续的执行语句,可以在代码中通过调用函数来执行它们。函数能将复杂的逻辑转换为一块块的代码块,使得更具可读性,另外有一些公共的函数,可以让团队合作更加便利,在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    

}


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:llkevin13579

查看原文:关于Golang的那些事(五) -- 函数

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

428 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传