关键字:func
函数定义:
func eval(a,b int,op string) string {
}
go语言中,函数定义使用关键字func,函数名在前,函数返回值类型在后,参数定义也一样,参数名在前,参数类型在后,同类型的参数可以写在一起。如 a,b int
多个返回值的函数:
func div(a,b int )(int,int) {
return a/b,a%b
}
也可以给返回值命名:
func div(a,b int )(q,r int) {
return a/b,a%b
}
调用:
q,r:=div(13,3)
使用定义的返回值来进行返回:
func div(a,b int )(q,r int) {
q=a/b
r=a%b
return
}
只接受其中一个返回值:
func main() {
q,r:=div(13,4)
fmt.Println(q,r)
a,_:=div(13,4)
fmt.Println(a)
}
控制台:
3 1
3
Process finished with exit code 0
如果只想接受其中一个返回值,另一个用下划线占位即可。
多返回值常用于返回一个正确值和一个报错值。
改造之前的一个函数为多返回值,并且返回一个结果和一个报错值:
func eval(a,b int, op string ) (int,error) {
switch op {
case "+":
return a+b,nil
case "-":
return a-b,nil
case "*":
return a*b,nil
case "/":
return a/b,nil
default:
return 0,fmt.Errorf("unsupported operator: %s\n",op)
}
}
调用:
if res,error:=eval(4,5,")");error!=nil{
fmt.Println(error)
}else {
fmt.Println(res)
}
控制台:
unsupported operator: )
Process finished with exit code 0
if res,error:=eval(4,5,"*");error!=nil{
fmt.Println(error)
}else {
fmt.Println(res)
}
控制台:
20
Process finished with exit code 0
这样就不会有报错信息大片的提示,go语言中这样的用法很多,比如打开文件,读取文件等,都是这样的用法。
go语言中函数是一等公民,所以可以改造上面的函数:
func apply(op func(int,int) int,a ,b int) int {
p:=reflect.ValueOf(op).Pointer()
funcName:= runtime.FuncForPC(p).Name()
fmt.Printf("function name:%s\n",funcName)
return op(a,b)
}
apply函数有三个参数,第一个参数为一个函数,该函数有两个int类型参数,还有一个int类型的返回值,至于这个函数要干什么,现在还不知道。
p:=reflect.ValueOf(op).Pointer()
funcName:= runtime.FuncForPC(p).Name()
这两句是用反射获取这个函数的名字,具体怎么做的以后再研究吧,咱也不知道咱也不敢问。
最后返回op函数的调用结果。
调用:
fmt.Println(apply(pow,2,4))
pow函数:求a的b次方,并且返回结果
func pow(a,b int) int {
return int(math.Pow(float64(a),float64(b)))
}
控制台输出:
function name:main.pow
16
Process finished with exit code 0
可以看到打印出函数的名字和计算结果,这样写好像是高级了一点,不用在一个函数里面写大量的switch-case还有返回。
或者不用定义函数,直接用匿名函数的写法也可以:
fmt.Println(apply(func(i int, i2 int) int {
return i*i2
},2,4))
控制台:
function name:main.main.func1
8
Process finished with exit code 0
函数名字name:main.main.func1:第一个main是包名,第二个main是main函数,函数名为func1,因为是匿名函数,所以是从第一个开始,打印出为func1,结果是2*4=8,没错
这就是函数式编程,函数的参数也可以是一个函数。
go语言没有默认参数,函数重载这些操作,好像比java来的简单一点了,go唯一有的是可变参数列表。
func sum(numbers ...int) int {
s:=0
for i:= range numbers{
s+=numbers[i]
}
return s
}
参数为可变个数的int类型,返回值为int
函数功能为求和,返回结果
其中range应该是便利后面数组中的每一个元素吧,暂时不知道,后面再学习吧。
控制台:
21
Process finished with exit code 0