函数的使用访问权限闭包匿名函数多返回值函数01.03.02.04.目录包管理05.01访问权限•Go语言访问权限•Go语言没有像其它语言一样有public、protected、private等访问控制修饰符•Go语言通过字母大小写来控制可见性的•如果定义的常量、变量、类型、接口、结构、函数等的名称是:大写字母开头表示能被其它包访问或调用(相当于public),非大写开头就只能在包内使用(相当于private,变量或常量也可以下划线开头)1访问权限各包之间访问权限以小写开头,则只在当前包中可见,可在当前包中直接使用以大写开头,则是公共实体,在其它包中可见,可导入使用1访问权限packagemycomimport"fmt"funcIsBlank(strstring)bool{returnisEmpty(str)}funcisEmpty(strstring)bool{iflen(str)>0{returntrue}returnfalse}“Public”函数-要大写字母开头。若以小写字母开头,同包可以访问,其他包不能访问。02匿名函数•匿名函数概念•匿名函数定义格式2匿名函数•Go语言支持匿名函数,在Go中也被称作函数字面量•Go语言支持随时在代码里定义匿名函数;可以在需要使用函数时再定义函数;•函数可以作为一种类型被赋值给函数类型的变量,匿名函数也往往以变量方式传递;•Go语言中的匿名函数是指不需要定义函数名的一种函数实现方式,由一个不带函数名的函数声明和函数体组成。匿名函数的特点func(参数列表)(返回参数列表){函数体}(实参)匿名函数的定义2匿名函数packagemainimport("fmt")funcmain(){//定义并调用Go语言的匿名函数func(){fmt.Println("HelloHaiCoder")}()}我们定义了一个匿名函数,并且在该匿名函数的最后使用()的形式来调用该匿名函数,结果输出了匿名函数的函数体内容。如果该匿名函数最后不加(),那么该匿名函数就不会被执行。运算结果为:HelloHaiCoder2匿名函数packagemainimport("fmt")funcmain(){//定义并调用带参数的匿名函数func(num1,num2int){fmt.Println(num1,"+",num2,"=",num1+num2)}(10,20)}我们定义了一个带两个int类型参数的匿名函数,并且在该匿名函数的最后使用()的形式来调用该匿名函数,在()里面我们传入了10和20,即10和20是这个匿名函数的参数,结果输出了这两个参数的和。运算结果为:10+20=302匿名函数匿名函数使用总结定义并同时调用匿名函数,在定义匿名函数时,可以通过在匿名函数后添加“()”的方式直接传入实参。将匿名函数赋值给函数变量,就可以通过调用函数变量来使用匿名函数。2匿名函数funcwalk(lis[]int,callbackfunc(int)){}匿名函数作为参数packagemainimport"fmt"funcwalk(lis[]int,callbackfunc(int)){for_,i:=rangelis{callback(i)}}funcmain(){slice:=[]int{1,2,3,4}walk(slice,func(iint){fmt.Println("Num=",i)})}运算结果为:Num=1Num=2Num=3Num=4匿名函数作为参数案例•我们定义了一个带两个参数的函数walk,第一个参数是一个int切片,第二个参数是一个带int类型参数的匿名函数callback;•该函数的功能是使用for循环遍历切片里的每一个数,并调用callback。packagemainimport"fmt"funcprint(numint){fmt.Println("Num=",num)}funcwalk(lis[]int,callbackfunc(int)){for_,i:=rangelis{callback(i)}}funcmain(){slice:=[]int{1,2,3,4}walk(slice,print)}运算结果为:Num=1Num=2Num=3Num=4Go语言中也可以先定义出函数,再将函数作为参数2匿名函数03闭包•闭包形成环境•函数本身不存储任何信息,只有与引用环境结合后形成的闭包才具有“记忆性”•函数是编译期静态的概念,而闭包是运行期动态的概念•闭包(Closure)在某些编程语言中也被称为Lambda表达式闭包的作用•函数+引用环境=闭包•闭包是一种特殊匿名函数•闭包是指引用了自由变量的函数,被引用的自由变量和函数一同存在•即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量闭包的特性3闭包3闭包packagemainimport"fmt"funcmain(){f:=demo()fmt.Println(f())fmt.Println(f())fmt.Println(f())fmt.Println(f())}funcdemo()func()int{varxintreturnfunc()int{x++returnx*x}}fmt.Println(f())表示为在打印时调用f()函数,在demo()函数中给与赋值...