如何理解Go函数是一等公民原理及使用场景
引言
在接触Go这么语言,可能你经常会听到这样一句话。Go语言中,函数属于一等公民,你可能很费解,什么是一等公民。是因为函数的优先级很高吗?如果是又是怎样的优先级呢?本文将分享Go语言中函数是一等公民的真正面纱。
什么是函数
在了解一等公民之前,先普及一下函数基础知识。函数是执行某种特定功能的代码块,一个较大的程序一般应分为若干个程序块,每一个模块用来实现一个特定的功能,这里的模块就可以称之为函数。
// 函数的定义 func FunName(变量名 变量类型...) (返回类型...) { return 返回值... }
在Go语言中,函数可以分配给一个变量,可以作为函数的参数,也可以作为函数的返回值。这样的行为就可以理解为函数属于一等公民。
函数使用场景
匿名函数
通过匿名函数的形式,将一个函数分配给一个变量。
package main import ( "fmt" ) func main() { a := func() { fmt.Println("hello world first class function") } a() fmt.Printf("%T", a) }
在上面的程序中,我们为第 8 行中的变量分配了一个函数。这是将函数分配给变量的语法。如果您仔细注意,分配给的函数没有名称。这些类型的函数称为匿名函数,因为它们没有名称。
也可以调用匿名函数而不将其分配给变量。让我们在下面的示例中看看这是如何完成的。
package main import ( "fmt" ) func main() { func() { fmt.Println("hello world first class function") }() }
在上面的程序中,在第 8 行中定义了一个匿名函数,紧接着函数定义之后,我们使用第10行("()")调用该函数。
自定义函数类型
就像我们定义自己的结构类型一样,也可以定义自己的函数类型。
type add func(a int, b int) int
上面的代码片段创建了一个新的函数类型,它接受两个整数参数并返回一个整数。现在我们可以定义类型的变量。
package main import ( "fmt" ) type add func(a int, b int) int func main() { var a add = func(a int, b int) int { return a + b } s := a(5, 6) fmt.Println("Sum", s) }
在上面的程序中,在第 10 行,我们定义了一个变量 type,并为其赋值一个签名与类型匹配的函数。我们调用第 13 行中的函数并将结果分配给s变量。将打印结果:
Sum 11
函数作为参数
在Go语言中,也是支持将函数作为另外一个函数的参数进行传递。
package main import ( "fmt" ) func simple(a func(a, b int) int) { fmt.Println(a(60, 7)) } func main() { f := func(a, b int) int { return a + b } simple(f) }
在上面的示例中,在第 7 行中,我们定义了一个函数,该函数接受一个接受两个 int 参数并返回一个 int 作为参数的函数。在第 12 行的 main 函数中,我们创建了一个匿名函数,其签名与函数的参数匹配。我们在下一行中调用 and 传递作为参数。
函数作为返回值
在Go语言中,也可以将函数作为另外一个函数的返回值进行传递。
package main import ( "fmt" ) func simple() func(a, b int) int { f := func(a, b int) int { return a + b } return f } func main() { s := simple() fmt.Println(s(60, 7)) }
在上面的程序中,第 7 行中的简单函数返回一个函数,该函数接受两个参数并返回。
闭包
闭包是匿名函数的特例。闭包是匿名函数,用于访问在函数主体外部定义的变量。
package main import ( "fmt" ) func main() { a := 5 func() { fmt.Println("a =", a) }() }
在上面的程序中,匿名函数访问变量,该变量存在于其主体之外的第 10 行。因此,这个匿名函数是一个闭包。
实战演示
上面提到了一些函数相关的知识,这里以函数作为形参演示一个demo。
将函数作为参数,将数组中的每一个元素都 * 5。
package main import "fmt" func sum(array [3]int, f func(int)int) [3]int { newArray := [3]int{0, 0, 0} for k, v := range array { newArray[k] = f(v) } return newAarray } func main() { a := [3]int{1, 2, 3} sum(a, func(n int) int { return n * 5 }) }
以上就是如何理解Go函数是一等公民原理及使用场景的详细内容,更多关于Go函数一等公民的资料请关注脚本之家其它相关文章!
相关文章
详解Golang函数式选项(Functional Options)模式
什么是函数式选项模式,为什么要这么写,这个编程模式解决了什么问题呢?其实就是为了解决动态灵活的配置不同的参数的问题。下面通过本文给大家介绍Golang函数式选项(Functional Options)模式的问题,感兴趣的朋友一起看看吧2021-12-12Go语言基础知识总结(语法、变量、数值类型、表达式、控制结构等)
这篇文章主要介绍了Go语言基础知识总结(语法、变量、数值类型、表达式、控制结构等),本文汇总了Go语言的入门知识,需要的朋友可以参考下2014-10-10
最新评论