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
posted @ 2018-03-10 15:36  小白兔奶糖  阅读(157)  评论(0编辑  收藏  举报