Go 语言中的大哥大:看似普通的函数,凭什么?

在编程语言设计中,给定编程语言中的一等公民(也就是类型,对象,实体或值)可以把函数赋值给变量,也可以把函数作为其它函数的参数或者返回值来直接使用。

Go 语言的函数也满足这个定义,因此常被称为 “一等公民”,非常有意思。了解清楚背景后,接下来进一步展开。

普通函数

在 Go 语言中普通函数的定义格式为 func [函数名](入参)(出参),如下:


  1. func callFuncA(x, y string) (s string, err error) { 
  2.  return x + y, nil 
  3.  
  4. func main() { 
  5.  callFuncA("炸""煎鱼"

在示例代码中声明了一个函数名为 callFuncA 的方法,他只允许在包内调用,因此首字母为小写。

其具有两个入参,分别是 x 和 y,类型都为 string。而出参为变量 s 和 err,类型分别为 string 和 error。

另外在函数体内返回值时,也可以采用快捷返回的方式:


  1. func callFuncA(x, y string) (s string, err error) { 
  2.  s = x + y 
  3.  return 

在出参时所声明的变量名称,是可以应用到自身函数的。因此若直接执行 return 则会隐式返回已经声明的出参变量。

在函数定义时,其入参还支持可变参数的语法:


  1. func callFuncA(x …string) (s string, err error) { 
  2.  s = strings.Join(x, ","
  3.  return 
  4.  
  5. func main() { 
  6.  fmt.Println(callFuncA("炸""煎鱼")) 

在入参变量上声明为 x …string,则表示变量 x 是 string 类型的可变变量,能够在入参时传入多个 string 参数。

可变变量所传入的格式为切片(slice)类型,该类型我们会在后面的章节进行讲解,你可以理解为不受长度限制的动态数组:


  1. [0: 炸 1: 煎鱼] 

一般对可变变量的常见后续操作多是循环遍历处理,又或是进行拼接等操作。

匿名函数

Go 语言也默认支持匿名函数的声明,声明的方式与普通函数几乎一样:


  1. func main() { 
  2.  s := func(x, y string) (s string, err error) { 
  3.   return x + y, nil 
  4.  } 
  5.  
  6.  s("炸""煎鱼"

匿名函数可以在任意地方声明,且不需要定义函数名,如果在函数体后马上跟 () 则表示声明后立即执行:


  1. func main() { 
  2.  s, _ := func(x, y string) (s string, err error) { 
  3.   return x + y, nil 
  4.  }("炸""煎鱼"

而在所有的函数类使用中,有一点非常重要,那就是函数变量作用域的理解:


  1. func main() { 
  2.  x, y := "炸""煎鱼" 
  3.  s, _ := func() (s string, err error) { 
  4.   return x + y, nil 
  5.  }() 
  6.  fmt.Println(s) 

该匿名函数没有形参,函数内部没有定义相应的变量,此时其读取的是全局的 x、y 变量的值,输出结果是 “炸煎鱼”。

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章