go_函数
函数语法要点
返回值类型写在最后面
可返回多个值
函数可作为参数
没有默认参数,可选参数,只有可变参数列表(...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)\n",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
浙公网安备 33010602011771号