你好,我是小小酥,在上一篇文章中,我们介绍了go语言中的数组,切片和map,也介绍了面试中经常问到的make和new的区别,今天我们继续介绍go语言中的函数,结构体和接口,坐好了,准备发车~
函数定义funcadd(aint,bint)int{}
如上面的代码,go语言的函数由五部分组成
其中我们通过func关键字来声明一个函数,func后跟着的是函数名,参数列表,以及函数返回值。
我们将这几部分称为函数签名(func+函数名+参数列表+函数返回值),在函数签名后则是由一对大括号{}包装的函数体。
PHPER请注意:和php不同的是,在go语言中,函数的参数和返回值都需要明确参数类型。
多返回值funcswap(aint,bint)(int,int){returnb,a}
在go语言中,函数是可以拥有多个返回值的,如上面的代码,在交换两个数的场景中,不借助其他函数的情况下,一行代码即可实现。(在php中,我们通常会利用中间变量或者list函数来协助实现)
多返回值,在go语言内置的函数中随处可见,也是我们在go工程中经常使用到的。
一等公民go语言中的函数,可以存储在变量中,也可以作为参数传递给另一个函数或者作为返回值从另一个函数返回,我们将拥有这样特性的元素称为一等公民。
函数作为参数
packagemainvaradd=func(a,bint)int{//定义一个加法函数并存入变量addreturna+b}varsub=func(a,bint)int{//定义一个减法函数并存入变量subreturna-b}funccalculator(expfunc(a,bint)int,a,bint){//定义一个计算器函数exp(a,b)}funcmain(){calculator(add,1,2)//将加法函数和需要计算的值一起传入计算器calculator(sub,1,2)//将减法函数和需要计算的值一起传入计算器}
函数作为返回值
packagemainimport"fmt"funcfuncMaker(expstring)func(int,int)int{//声明一个函数生成器,通过传入的字符串来返回不同的函数switchexp{case"add":returnfunc(aint,bint)int{//当exp=="add"时,返回一个加法函数returna+b}case"sub":returnfunc(aint,bint)int{//当exp=="sub"时,返回一个减法函数returna-b}default:returnnil}}funcmain(){exp:=funcMaker("add")fmt.Println(exp(1,2))}
其实通过上面的两个例子我们可以看到,无论是将函数赋值给一个变量,还是将函数作为返回值,我们的func关键字后面都没有具体的函数名,因此我们也将其称为匿名函数。
函数的可见性packageuserfuncgetUserInfo(idint)(string,uint8){return"xiaoming",19//返回name,age}funcGetUserInfo(id){return"xiaoming"}
go语言中,我们通过函数首字母的大小写来控制函数的可见性。
对于首字母大写的函数,既为可见性为public的函数,可以被其他包引用。
对于首字母小写的函数,既为可见性为private的函数,只能在当前的包中使用。
参数的传递最后我们再聊一下go语言中函数参数的传递,需要记住的是,在go语言中,函数参数的传递都是值传递。
值传递
指在调用函数时,将实际参数复制一份传递到函数中,因此在函数中对参数进行修改,不会影响到实际参数的值。
引用传递
指在函数调用时,将实际参数的地址传递到函数中,那么在函数中对参数进行修改时,会影响到实际参数的值。
我们通过两个实例来证实go语言中函数参数的传递都是值传递这一说法。
packagemainimport"fmt"funcmodify(jint){fmt.Printf("变量j的内存