第六节:函数

关键字:func

函数定义:

func eval(a,b int,op string) string {
	
}

go语言中,函数定义使用关键字func,函数名在前,函数返回值类型在后,参数定义也一样,参数名在前,参数类型在后,同类型的参数可以写在一起。如 a,b int 

 

多个返回值的函数:

func div(a,b int )(int,int)  {
	return a/b,a%b
}

也可以给返回值命名:

func div(a,b int )(q,r int)  {
	return a/b,a%b
}

调用:

q,r:=div(13,3)

使用定义的返回值来进行返回:

func div(a,b int )(q,r int)  {
	q=a/b
	r=a%b
	return 
}

只接受其中一个返回值:

func main() {
	q,r:=div(13,4)
	fmt.Println(q,r)
	a,_:=div(13,4)
	fmt.Println(a)
}

控制台:


3 1
3

Process finished with exit code 0

如果只想接受其中一个返回值,另一个用下划线占位即可。

多返回值常用于返回一个正确值和一个报错值。

改造之前的一个函数为多返回值,并且返回一个结果和一个报错值:

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 "/":
		return  a/b,nil

	default:
		return 0,fmt.Errorf("unsupported operator: %s\n",op)
	}
}

调用:

	if res,error:=eval(4,5,")");error!=nil{
		fmt.Println(error)
	}else {
		fmt.Println(res)
	}

控制台:

unsupported operator: )


Process finished with exit code 0



	if res,error:=eval(4,5,"*");error!=nil{
		fmt.Println(error)
	}else {
		fmt.Println(res)
	}

控制台:

20

Process finished with exit code 0

这样就不会有报错信息大片的提示,go语言中这样的用法很多,比如打开文件,读取文件等,都是这样的用法。

go语言中函数是一等公民,所以可以改造上面的函数:

func apply(op func(int,int) int,a ,b int) int  {
	p:=reflect.ValueOf(op).Pointer()
	funcName:= runtime.FuncForPC(p).Name()
	fmt.Printf("function name:%s\n",funcName)
	return op(a,b)
}

apply函数有三个参数,第一个参数为一个函数,该函数有两个int类型参数,还有一个int类型的返回值,至于这个函数要干什么,现在还不知道。
	p:=reflect.ValueOf(op).Pointer()
	funcName:= runtime.FuncForPC(p).Name()
这两句是用反射获取这个函数的名字,具体怎么做的以后再研究吧,咱也不知道咱也不敢问。
最后返回op函数的调用结果。


调用:
fmt.Println(apply(pow,2,4))


pow函数:求a的b次方,并且返回结果
func pow(a,b int) int {
	return int(math.Pow(float64(a),float64(b)))
}


控制台输出:

function name:main.pow
16

Process finished with exit code 0

可以看到打印出函数的名字和计算结果,这样写好像是高级了一点,不用在一个函数里面写大量的switch-case还有返回。

或者不用定义函数,直接用匿名函数的写法也可以:

	fmt.Println(apply(func(i int, i2 int) int {
		return i*i2
	},2,4))

控制台:

function name:main.main.func1
8

Process finished with exit code 0

函数名字name:main.main.func1:第一个main是包名,第二个main是main函数,函数名为func1,因为是匿名函数,所以是从第一个开始,打印出为func1,结果是2*4=8,没错

这就是函数式编程,函数的参数也可以是一个函数。

go语言没有默认参数,函数重载这些操作,好像比java来的简单一点了,go唯一有的是可变参数列表。

func sum(numbers ...int) int {
	s:=0
	for i:= range numbers{
		s+=numbers[i]
	}
	return s
}

参数为可变个数的int类型,返回值为int

函数功能为求和,返回结果
其中range应该是便利后面数组中的每一个元素吧,暂时不知道,后面再学习吧。

控制台:

21

Process finished with exit code 0

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值