七、go 函数
一、普通函数
package main
import "fmt"
func eval(a, b int, op string) int {
switch op {
case "+":
return a + b
case "-":
return a - b
case "*":
return a * b
case "/":
return a / b
default:
panic("unsupported operation:" + op)
}
}
func main() {
fmt.Println(eval(10, 40, "+"))
}
二、返回多个值
package main
import "fmt"
func div(a, b int) (int, int) {
return a / b, a % b
}
func main() {
q, r := div(13, 3)
fmt.Println(q, r)
}
还可以定义返回值变量,这样 return
就会直接返回,
但是如果写的代码很多行,可能搞不清楚到底是哪一行给 q
,r
赋值,所以还是建议在 return
的时候指明具体返回值
package main
import "fmt"
func div(a, b int) (q int, r int) {
q = a / b
r = a % b
return
}
func main() {
q, r := div(13, 3)
fmt.Println(q, r)
}
如果指想接收一个返回值
_, r := div(14, 3)
多值返回,通常是增加错误信息一起返回
package main
import "fmt"
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("unsuported operation:%s", op)
}
}
func main() {
if result, err := eval(20, 10, "+"); err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
}
三、函数式编程
go
语言是函数式编程语言,所以函数是一等公民
函数的参数、返回值、函数体内都可以有函数
package main
import (
"fmt"
"math"
)
func div(a, b int) (q int, r int) {
return a / b, a % b
}
func apply(op func(int, int) int, a, b int) int {
return op(a, b)
}
func pow(a, b int) int {
return int(math.Pow(float64(a), float64(b)))
}
func main() {
fmt.Println(apply(pow, 2, 3))
}
也可以定义匿名函数直接当作参数
fmt.Println(
apply(
func(a, b int) int {
return int(math.Pow(float64(a), float64(b)))
},
3,
4,
),
)
四、可变参数
package main
import (
"fmt"
"math"
)
func sum(numbers ...int) int {
s := 0
for i := range numbers {
s += numbers[i]
}
return s
}
func main() {
fmt.Println(sum(1, 2, 3))
}
numbers
相当于就是一个数组