函数语法要点
返回值类型写在最后面
可返回多个值
函数可作为参数
没有默认参数,可选参数,只有可变参数列表(...int)
package main import ( "fmt" "reflect" "runtime" "math" ) 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 "/": //result = a/b //两个返回值中取其中一个返回值 q,_ :=div(a,b) return q,nil default: return 0,fmt.Errorf( "unsupported operation %s ",op, ) } } //返回多个值 func div(a,b int) (q,r int){ //q = a / b //r = a % b //return return a / b, a % b } //函数里面的参数可以时函数 func apply(op func(int, int) int, a, b int) int { p:=reflect.ValueOf(op).Pointer()//获取函数的指针 opName:=runtime.FuncForPC(p).Name() fmt.Printf("Calling function %s with 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 sum(numbers ...int) int{ s := 0 for i := range numbers{ s += numbers[i] } return s } func main() { //fmt.Println( // eval(3,4,"x"), //) //q,r :=div(13,3) //fmt.Println(q,r) fmt.Println(apply(func(a int, b int) int { return int(math.Pow(float64(a),float64(b))) },3,4)) fmt.Println(apply(pow,3,4)) fmt.Println(sum(1,2,3,4,5)) }
闭包函数保存并积累其中的变量的值,不管外部函数退出与否,它都能够继续操作外部函数中的局部变量。
package main import "fmt" func main() { var f = Adder() fmt.Print(f(1), " - ") fmt.Print(f(20), " - ") fmt.Print(f(300)) } func Adder() func(int) int { var x int return func(delta int) int { x += delta return x } }
输出:
1 - 21 - 321