当前位置: 首页 > 科技观察

一篇文章带你了解Go语言的基本功能(下)_0

时间:2023-03-13 09:03:58 科技观察

上次主要复习了以上。我们知道定义一个函数可以理解函数的内存分配如下。同时我们也知道,不管进行什么操作,都会操作栈上的值。函数和变量函数名就是变量。不知道你有没有想过。定义一个变量,接收一个函数,就像这样。packagemainimport"fmt"funcsay(){fmt.Println("say")}funcmain(){vars1=says1()}执行结果如下。可以发现,通过变量接收一个函数名,通过变量名+括号执行是没有问题的。那么,这个变量的类型是什么???fmt.Printf("%T\n",s1)执行结果say函数改了怎么办?funcsay(sint)int{fmt.Println("say")return1}fmt.Printf("%T\n",s1)可以发现如果函数参数和返回值不同,打印的类型也不同。定义函数类型如上所述,可以通过变量接收函数名。通过变量接收函数名没有限制,不管函数有多少个参数或返回值都可以接收,真像动态语言。而定义函数类型就是限制变量接收函数只能接收指定格式的函数。主要使用type关键字。formattype变量名func([参数类型,参数类型])[返回值类型]方括号表示可选参数如typeafunc()typebfunc(int)typeafunc(int,int)int具体代码packagemainimport"fmt"/*定义一个函数类型的变量接收的函数参数必须是两个int类型的函数,函数的返回值也必须是int类型*/typecTypefunc(int,int)intfuncsay1(a,bint)int{fmt.Println("say",a+b)return1}funcsay2(a,bint){fmt.Println("say")}funcmain(){vars1cTypes1=say1//调用s1实际上调用了say1s1(1,1)//vars2cType//s2=say2//报错,不能用say2(typefunc(int,int))astypecTypeinaassignment}高阶函数千万不要被这个名字忽悠了。简单来说,高阶函数就是接受一个函数作为参数或者返回一个函数作为返回值。该函数作为参数packagemainimport"fmt"funcadd(xint,yint)int{returnx+y}funccalc(xint,yint,otherfunc(int,int)int)int{returnother(x,y)}funcmain(){//将add函数传入第三个参数varresult=calc(34,12,add)fmt.Println(result)}函数作为返回值packagemainimport"fmt"funcadd(xint,yint)int{returnx+y}functest()(func(int,int)int){returnadd}funcmain(){vara=test()fmt.Println(a(1,2))}至于上面两个函数,见谅,目前使用的场景并不多。匿名函数匿名函数,顾名思义,就是没有名字的函数。func([parameter,parameter...])[(returnvalue,returnvalue)]{code}()//匿名函数后面必须加括号,直接执行//匿名函数后面必须加括号,直接执行这样如func(){}()func(xint,yint)(int){returnx+y}()codepackagemainimport"fmt"funcmain(){//s1等于匿名函数,直接执行vars1=func(xint,yint)(int){returnx+y}(1,2)fmt.Println(s1)}closure闭包,这个有点不清楚,简单的说,函数里面有函数,函数里面有变量引用外部函数。示例packagemainimport"fmt"funcother()func(){//返回的是函数类型vara=666returnfunc(){//内部函数使用afmt.Println(a)}}funcmain(){varo=other()o()}执行结果。结果没问题。虽然我们之前已经了解到,函数执行后,里面的变量会被回收。但是在使用闭包的时候,可以这样理解,如果内层函数使用了外层函数的变量,那么这个变量就不会被回收。小结本文主要介绍函数和变量、高阶函数、匿名函数和闭包。闭包比较难理解,必须要花点心思。宝剑锋自磨砺出,梅花香自苦寒来。你必须多练习。如果您在操作过程中有什么问题,记得在下方留言,我们看到会第一时间解决。周五我是码农,如果觉得还不错记得点个赞哦。感谢您的收看。