- 返回值类型写在最前面
- 可返回多个值
- 函数作为参数
- 没有默认参数,有可选参数
package main
import (
"fmt"
"math"
"reflect"
"runtime"
)
func eval(a, b int, op string) (int, error) {
switch op{
case "+":
return a + b ,nil
case "-":
return a - b ,nil
default:
return 0 ,fmt.Errorf("unsupport:%s", op)
}
}
func apply(op func(int, int) int , a, b int) int{
p := reflect.ValueOf(op).Pointer()
opName := runtime.FuncForPC(p).Name()
fmt.Printf("Calling %s is" + "(%d, %d)\n", opName, a, b)
return op(a, b)
}
func pow(a, b int) int {
return int(math.Pow (float64(a), float64(b)))
}
func sumArgs(numbers ...int ) int {
s := 0
for i := range(numbers) {
s += numbers[i]
}
return s
}
func main() {
if result, err := eval(3, 4, "x"); err != nil {
fmt.Println("Error:",err)
}else{
fmt.Println(result)
}
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,6,7))
}