函数
函数可返回多个值,还可以给返回的多个值起名字,起名字仅用于非常简单的函数
func eval(a,b int ,op string) int {
switch op{
case "+":
return a+b
case "-":
return a-b
case "*":
return a*b
case "/":
q,_:=div1(a,b) //调用下文的除法,只返回除数,余数可以用下划线代替
return q
//return a/b
default:
panic("unsupported operation: "+op)
}
}
//根据可以有两个返回值,我们可以写eval函数为把错误抛出,返回值的常用场景,用于返回error的情况
func eval1(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 "/":
q,_:=div1(a,b) //调用下文的除法,只返回除数,余数可以用下划线代替
return q,nil
//return a/b
default:
return 0,fmt.Errorf("unsupported operation : %s" ,op)
}
}
//除数与余数函数
func div0(a,b int) (int,int){
return a/b,a%b
}
//如果返回值过长,建议用div0
func div1(a,b int)(q,r int){
q=a/b
r=a%b
return
}
func main() {
//fmt.Println(eval(3,4,"c"))
if result,err:=eval1(3,4,"c"); err != nil{
fmt.Println("error:",err)
}else{
fmt.Println(result)
}
fmt.Println(div0(13,3))
//接收两个返回值
q,r:=div1(13, 3)
println(q,r)
}
go语言是函数式编程,函数的参数可以是函数
上述eval方法可以实现如下:
func apply(op func(int,int) int,a,b int) int{
p:=reflect.ValueOf(op).Pointer()
opName:=runtime.FuncForPC(p).Name()
fmt.Println("Calling function with %s args"+"(%d,%d)",opName,a,b)
return op(a,b)
}
func pow(a,b int) int{
return int(math.Pow(float64(a),float64(b)))
}
func main() {
fmt.Println(apply(pow,3,4))
//也可以不用重写pow函数,直接写匿名函数,输出结果为main.main.func1第一个main是包名,第二个main是主函数,func1是这个匿名函数
fmt.Println(apply(func(a,b int) int{
return int(math.Pow(float64(a),float64(b)))
},3,4))
fmt.Println(sumArgs(1,2,3,4,5))
}
go语言中函数参数可变,入参可以是可变参数列表,用起来像数组一样用
func sumArgs(values ...int) int{
s:=0
for i:=range values{
s+=values[i]
}
return s
}
func main() {
fmt.Println(sumArgs(1,2,3,4,5))
}
函数语法要点:
- 返回值类型写在最后面
- 可返回多个值
- 函数可作为参数
- 没有默认参数可选参数
- 有可变参数列表