Go 语言的函数是“一等公民”?

开发 前端
如果对如何创建和使用它没有任何限制:当该结构可以被视为没有限制的值时,该语言结构被称为该语言中的 FirstClass 值。

1.介绍

在 Go 语言中,函数被称为“一等公民”。实际上,在其它编程语言中,也有此说法,例如 JavaScript。

什么是编程语言的“一等公民”?Ward Cunningham 的解释如下:

如果对如何创建和使用它没有任何限制:当该结构可以被视为没有限制的值时,该语言结构被称为该语言中的 FirstClass 值。

A language construct is said to be a FirstClass value in that language when there are no restrictions on how it can be created and used: when the construct can be treated as a value without restrictions.

“一等公民”的特性是可以存储在变量中,可以作为参数传递给函数,可以在函数中创建并作为返回值从函数返回。

FirstClass features can be stored in variables, passed as arguments to functions, created within functions and returned from functions. In dynamically typed languages, a FirstClass feature can also have its type examined at run-time.

本文我们介绍一下 Go 语言的函数是否符合“一等公民”的特性。

2.存储在变量中

Go 语言的函数可以作为变量的值,存储在变量中。

func main() {
var hello = func(name string) { fmt.Printf("hello %s\n", name) }
hello("gopher")
}

阅读上面这段代码,我们定义一个变量 hello,和一个匿名函数,将匿名函数赋值给变量 hello,我们可以通过变量调用该匿名函数。

3.作为参数传递给其他函数

Go 语言的函数可以作为参数,传递给其他函数。

https://back-media.51cto.com/editor?id=704975/h6e90be6-6IhK9UNI

阅读上面这段代码,我们定义三个函数,分别是 Circle、areaOfCircle 和 perimeterOfCircle,其中 areaOfCircle 和 perimeterOfCircle 作为 Circle 的参数,分别用于计算面积和周长。

4.可以在函数中创建,并作为返回值

Go 语言的函数可以在函数体中创建,并作为返回值从函数体中返回。

func main() {
calcArea := CircleCalc("area")
fmt.Println(calcArea(5))
calcPerimeter := CircleCalc("perimeter")
fmt.Println(calcPerimeter(5))
}

func CircleCalc(s string) func(float64) float64 {
switch s {
case "area":
return func(r float64) float64 {
return math.Pi * r * r
}
case "perimeter":
return func(r float64) float64 {
return 2 * math.Pi * r
}
default:
return nil
}
}

阅读上面这段代码,我们定义一个函数 CircleCalc,在其函数体中定义两个匿名函数,并将匿名函数作为返回值从函数体中返回。

5.总结

本文我们通过三段示例代码,证明 Go 语言中函数符合“一等公民”的特性,我们可以使用这些特性,使业务代码更加简洁。

责任编辑:武晓燕 来源: Golang语言开发栈
相关推荐

2023-03-28 07:26:37

2021-03-18 08:54:55

Go 语言函数

2021-01-27 05:25:44

Go语言函数

2022-11-07 18:12:54

Go语言函数

2015-04-27 09:48:46

Kubernetes数据中心

2021-04-13 07:58:42

Go语言函数

2022-02-17 16:44:19

函数Go 语言高阶函数

2020-11-09 07:25:20

函数 JavaScript数据

2022-03-11 10:31:49

Go语音

2011-08-01 14:37:13

2018-03-12 22:13:46

GO语言编程软件

2024-08-26 08:36:26

2021-07-07 21:40:46

Rust函数劝退

2020-12-29 06:44:18

GoScala编程语言

2009-03-04 11:22:15

Linux优越感高人一等

2023-04-03 08:02:16

切片扩容GO

2021-01-22 07:48:07

JavaScript 高阶函数闭包

2017-03-10 09:33:16

JavaScript类型

2019-09-26 09:42:44

Go语言JavaPython

2023-05-06 07:27:47

点赞
收藏

51CTO技术栈公众号