一等函数的实际应用
到目前为止,我们已经定义了什么是第一类函数,我们也看到了一些精心设计的例子来学习它们是如何工作的。现在让我们来写一个具体的程序,展示第一类函数的实际用途。
我们将创建一个程序,根据一些标准来过滤一部分学生。让我们一步一步地去做。
首先让我们定义学生类型:
type student struct { firstName string lastName string grade string country string }
下一步是编写 filter
函数。这个函数以一个学生切片和一个确定学生是否符合过滤标准的函数为参数。如下:
func filter(s []student, f func(student) bool) []student { var r []student for _, v := range s { if f(v) == true { r = append(r, v) } } return r }
在上述函数中,filter
的第二个参数是一个函数,它以一个 student
为参数,返回一个 bool 。这个函数确定一个特定的学生是否符合某个标准。我们在第 3 行遍历学生切片。如果该函数返回真,则意味着该学生通过了过滤标准,并被添加到切片 r 中。
现在来看一个完整的程序:
package main import ( "fmt" ) type student struct { firstName string lastName string grade string country string } func filter(s []student, f func(student) bool) []student { var r []student for _, v := range s { if f(v) == true { r = append(r, v) } } return r } func main() { s1 := student{ firstName: "Naveen", lastName: "Ramanathan", grade: "A", country: "India", } s2 := student{ firstName: "Samuel", lastName: "Johnson", grade: "B", country: "USA", } s := []student{s1, s2} f := filter(s, func(s student) bool { if s.grade == "B" { return true } return false }) fmt.Println(f) }
在主函数中,我们首先创建了两个学生 s1 和 s2,并将他们添加到片断 s 中。现在我们假设要找出所有成绩为 B 的学生,在上述程序中,我们通过传递一个检查学生是否为 B 级的函数,如果是,则返回 true。 上述程序将打印:
[{Samuel Johnson B USA}]
比方说,我们想找到所有来自印度的学生。这可以通过改变过滤器函数的参数来轻松实现。如下:
c := filter(s, func(s student) bool { if s.country == "India" { return true } return false }) fmt.Println(c)
让我们再写一个程序来结束本文。这个程序将对一个切片的每个元素进行同样的操作,并返回结果。
例如,如果我们想将一个切片中的所有整数乘以 5,并返回输出结果,可以用第一类函数轻松完成。
这类对集合中每个元素进行操作的函数被称为 map
函数。如下这个程序
package main import ( "fmt" ) func iMap(s []int, f func(int) int) []int { var r []int for _, v := range s { r = append(r, f(v)) } return r } func main() { a := []int{5, 6, 7, 8, 9} r := iMap(a, func(n int) int { return n * 5 }) fmt.Println(r) }
运行结果:
[25 30 35 40 45]
总结
在本文中,介绍了什么是一等函数的概念和功能,匿名函数、用户自定义函数类型、高阶函数和闭包,最后给出了一等函数的实际应用例子,希望这篇文章对你有所帮助!