Go函数学习

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "reflect"
 6     "runtime"
 7     "math"
 8 )
 9 
10 //函数
11 //函数可以返回两个值。返回多个值时可以起名字
12 //返回值类型写在最后面
13 //函数可以作为参数
14 //没有默认参数,可选参数
15 
16 func eval( a, b int , op string) ( int , error) {
17     switch op {
18     case "+":
19         return a + b , nil
20     case "-":
21         return a - b , nil
22     case "*":
23         return a * b , nil
24     case "/":
25         q, _ := div(a , b)  //下划线表示不想用那个返回值
26         return q , nil
27     default:
28         return 0 , fmt.Errorf("unsupported operation: %s" , op )
29     }
30 }
31 
32 func div( a, b int ) ( int , int)  {
33     return a / b, a % b
34 }
35 
36 func apply( op func( int , int ) int , a, b int ) int {  //参数名写在前,类型写在后
37     p := reflect.ValueOf(op).Pointer()
38     opName := runtime.FuncForPC(p).Name()
39     fmt.Printf("calling function %s with agrs" + "(%d,%d)  ",opName,a,b)
40     return op(a , b)
41 }
42 
43 func pow( a, b int) int {
44     return int (math.Pow( float64(a),float64(b)))
45 }
46 
47 func sum( numbers ...int) int {   //...传可变参数列表
48     s := 0
49     for i := range numbers {
50         s += numbers[i]
51     }
52     return  s
53 }
54 func main() {
55     if result , err := eval( 3,4,"x"); err != nil {
56         fmt.Println("Error",err)   //Error unsupported operation: x
57     }else {
58         fmt.Println(result)
59     }
60     fmt.Println(eval(3, 4, "*"))  // 12 <nil>
61     fmt.Println(eval(3, 4, "/"))  // 0  <nil>
62     fmt.Println( div(13 , 3))         // 4 1
63     fmt.Println(apply( pow,3,4))   //calling function main.pow with agrs(3,4)  81
64 
65     fmt.Println(apply(
66         func(a int, b int) int {
67             return int( math.Pow(
68                 float64(a), float64(b) ))
69         },3,4,
70     ))   //calling function main.main.func1 with agrs(3,4)  81
71 
72     fmt.Println(sum(1,2,3,4,5))  //15
73 }