深入理解Go语言一等函数及其应用对象编程语言Java、Ruby,动态语言Python、JavaScript,function的语法元素是当仁不让的核心。Go语言没有类、继承、对象等面向对象语言的语法,但Go语言最重要的部分是对一等函数的支持。在Go语言中,函数式风格是唯一根据特定输入实现特定任务并返回任务执行结果的代码块。本质上,Go程序是函数的集合。什么是一等函数一等函数允许函数被赋值给变量(通过变量传递函数),作为参数传递给其他函数,以及从其他函数返回。2.匿名函数让我们从一个简单的例子开始,这个例子将一个函数赋值给一个变量。上面程序中的packagemainimport("fmt")funcmain(){a:=func(){fmt.Println("LearningfirstclassFunction")}a()fmt.Printf("%T",a)},我们使用a:=func()将函数赋值给变量a,这是将函数赋值给变量的语法。那么我们赋给a的函数是没有名字的,这种类型的函数称为匿名函数。调用此函数的唯一方法是使用变量a,因此稍后使用a()调用此函数,将打印LearningfirstclassFunction;然后我们打印变量a的类型,这将打印func()。运行结果:学习firstclassFunctionfunc()也可以调用匿名函数而无需将其赋值给变量,我们看看下面的例子是如何做到的:("LearingfirstclassFunction")}()}在上面的程序中,第8行定义了一个匿名函数,然后我们在第10行用()调用这个函数。该程序将输出:LearingfirstclassFunction也可以像其他函数一样将参数传递给匿名函数:packagemainimport("fmt")funcmain(){func(nstring){fmt.Println("Welcometo",n)}("Gophers'sWorld!")}在上面的代码中,我们向匿名函数传递了一个nstringstring参数,然后传入了一个“Gophers'sWorld!”。调用时,此时运行程序会得到如下结果:欢迎来到地鼠世界!3.自定义函数类型就像我们自定义的结构类型一样,Go语言也支持自定义函数类型:typeaddfunc(aint,bint)int上面的代码片段创建了一个新的函数类型add,它接受两个整数参数并返回一个整数。现在我们可以定义add类型的变量,如下代码所示:{returna+b}sum:=a(2022,10)fmt.Println("a+b=",sum)}在上面的程序中,我们定义了一个add类型的变量,并为其分配了一个函数,其签名匹配add的类型,然后通过sum:=a(2022,10)调用,并将结果赋值给sum,程序运行后得到如下结果:a+b=20324高阶函数高阶函数的定义是,该函数至少完成以下功能之一:返回一个以一个或多个函数为参数的函数将函数作为参数传递给其他函数作为结果packagemainimport("fmt")funcsimple(afunc(a,bint)int){fmt.Println(a(60,7))}funcmain(){f:=func(a,bint)int{returna+b}simple(f)}我们定义一个函数simplefunction,它接收两个int参数,返回一个int参数,然后将匿名函数传递给变量f,再将f作为参数传递给simple函数,最后该程序将打印67输出:67Returnfunctionfromotherfunction现在让我们重写上面的程序以从简单函数返回一个函数:packagemainimport("fmt")funcsimple()func(a,bint)int{f:=func(a,bint)int{returna+b}returnf}funcmain(){s:=simple()fmt.Println(s(2022,60))}运行程序,得到结果;20825。闭包闭包是匿名函数的特例。闭包是一个匿名函数,它访问定义在函数体之外的变量。代码如下:packagemainimport("fmt")funcmain(){a:=2022func(){fmt.Println("a=",a)}()}每个闭包都绑定到它自己的周围变量当然。让我们通过一个简单的例子来理解这意味着什么。packagemainimport("fmt")funcappendStr()func(string)string{t:="Hello"c:=func(bstring)string{t=t+""+breturnt}returnc}funcmain(){a:=appendStr()b:=appendStr()fmt.Println(a("World"))fmt.Println(b("Everyone"))fmt.Println(a("Gopher"))fmt.Println(b("!"))}在上面的程序中,appendStr函数返回一个闭包。这个闭包绑定到变量t,变量a和b是绑定到它们自己的值t的闭包。我们把参数World传给a,然后a的值就变成了HelloWorld。把参数Everyone传给b,b的值就变成了HelloEveryone。HelloWorld大家好HelloWorldGopher大家好!闭包通常也是支持嵌套和延迟工作的方式。在下面的示例中,我们可以看到一个允许嵌套工作的函数闭包:packagemainimport("fmt""sort")funcmain(){input:=[]string{"foo","bar","baz"}varresult[]string//闭包回调func(){result=append(input,"abc")result=append(result,"def")sort.Sort(sort.StringSlice(result))}()fmt.Println(result)}运行结果:[abcbarbazdeffoo]6.一等函数的实际应用到目前为止,我们已经定义了什么是一等函数,我们也看到了一些设计良好的例子来学习如何他们工作。现在让我们编写一个具体的程序来展示第一类函数的实际使用。我们将创建一个程序,根据某些标准过滤一部分学生。让我们一步一步来。首先让我们定义学生类型:typestudentstruct{firstNamestringlastNamestringgradestringcountrystring}下一步是编写过滤函数。此函数将一部分学生和一个用于确定学生是否满足过滤条件的函数作为参数。如下:funcfilter(s[]student,ffunc(student)bool)[]student{varr[]studentfor_,v:=ranges{iff(v)==true{r=append(r,v)}}returnr}在上面的函数中,filter的第二个参数是一个以学生为参数的函数,返回一个bool。此功能确定特定学生是否符合特定标准。我们在第3行迭代了students切片。如果函数返回true,则意味着该学生通过了筛选条件并被添加到切片r中。现在看一个完整的程序:packagemainimport("fmt")typestudentstruct{firstNamestringlastNamestringgradestringcountrystring}funcfilter(s[]student,ffunc(student)bool)[]student{varr[]studentfor_,v:=ranges{iff(v)==true{r=append(r,v)}}returnr}funcmain(){s1:=student{firstName:"Naveen",lastName:“Ramanathan”,年级:“A”,国家:“印度”,}s2:=student{名字:“Samuel”,姓氏:“Johnson”,年级:“B”,国家:“美国”,}s:=[]student{s1,s2}f:=filter(s,func(sstudent)bool{ifs.grade=="B"{returntrue}returnfalse})fmt.Println(f)}在主函数中,我们首先创建两个学生s1和s2并将它们添加到片段s中。现在假设我们想要找到所有成绩为B的学生,在上面的程序中我们传递了一个函数来检查学生是否成绩为B,如果是,则返回true。上面的程序将打印:[{SamuelJohnsonBUSA}]假设我们想要找到所有来自印度的学生。这可以通过更改过滤器函数的参数轻松实现。如下:c:=filter(s,func(sstudent)bool{ifs.country=="India"{returntrue}returnfalse})fmt.Println(c)让我们再写一个程序来结束这篇文章。该程序将对切片的每个元素执行相同的操作并返回结果。例如,如果我们想将一个切片中的所有整数乘以5并返回输出,这可以使用一等函数轻松完成。这种对集合中的每个元素进行操作的函数称为映射函数。下面程序包mainimport("fmt")funciMap(s[]int,ffunc(int)int)[]int{varr[]intfor_,v:=ranges{r=append(r,f(v))}returnr}funcmain(){a:=[]int{5,6,7,8,9}r:=iMap(a,func(nint)int{returnn*5})fmt.Println(r)}运行结果:[2530354045]七、小结本文介绍一等函数的概念和作用,匿名函数,用户自定义函数类型,高阶函数和closures包,最后给出了一个函数实际应用的例子,希望这篇文章对你有所帮助!
