GO学习笔记——函数(8)

GO语言中的函数定义和C++也有一点差异,先来看一下一个简单的函数定义模型

func add(a,b int) int{
	return a + b
}

还是先说一下几点注意的地方

  1. GO语言中函数定义需要加上关键字func
  2. GO中的函数定义和变量定义的格式一样,函数名在前,返回值类型在后
  3. 函数也是可以不需要返回值的,这就和C++的void返回值类似;同样参数也是可以没有的

说一下GO语言中函数定义的一些特点。


函数定义是可以有多个返回值的

这在C++是似乎做不到,如果要返回多个返回值,我们通常将它们封装成一个对象,然后返回这个对象来达到这个效果,而GO语言中是可以支持函数返回多个返回值的。

来看看下面的代码。

func square(a,b int) (int,int){
	return a*a,b*b
}

下面的函数有两个返回值,所以用括号将这两个返回值给括起来了,在return的时候,也用逗号把两个返回值隔开。

函数多个返回值的场景一般用于报告错误处理,即返回一个非错误结果和一个错误处理报告,GO语言的错误处理之后会讲到。

命名返回值

GO语言是可以给返回值取一个别名的,像上面的代码只是两个int,这边我们来给它们取一个别名

func square(a,b int) (r1,r2 int){
	r1 = a * a
	r2 = b * b
	return	//这样可以直接return
}

r1和r2就是这两个返回值的别名,这种方式还是挺好的,不过函数比较复杂时,可能会搞不清到底返回了什么,所以适合简单的函数

下划线在函数中的使用

如果函数返回了多个返回值,但是我们只想要其中的一个,那么怎么办呢?

在接收返回值的时候我们是这么接收的

func square(a,b int) (r1,r2 int){
	r1 = a * a
	r2 = b * b
	return	//这样可以直接return
}

func main() {
	a,b := 1,2
	r1,r2 := square(a,b)
	fmt.Println(r1)    //没有用r2,编译器会报错
}

这个时候我们把r1和r2都接收到了,但是我们只想接收r1,r2我们不用。但是如果r2不用,在GO语言中编译器是会报错的,GO规定一个变量定义出来那么就必须使用。

所以我们就可以使用下划线代替r2,这样就可以让r2的返回值就像丢到了垃圾桶里了

func square(a,b int) (r1,r2 int){
	r1 = a * a
	r2 = b * b
	return	//这样可以直接return
}

func main() {
	a,b := 1,2
	r1,_ := square(a,b)
	fmt.Println(r1)    //程序编译通过
}

另外对C++中的一些函数特性在这里做一些总结

GO语言没有函数重载

func add(a,b int) int{
	return a + b
}

func add(a,b float64) float64{
	return a + b
}

对于上面的函数重载,GO是不支持的,会报如下的错误

.\func.go:9:23: add redeclared in this block

当然了,GO语言也没有对操作符的一些重载,因为函数重载都不支持了。C++是可以有操作符重载的。

GO语言函数没有默认参数

在C++中有这样的默认参数,如果没有传参数那么会使用默认参数

int add(int a = 0, int b = 0){
    return a + b
}

但是GO语言没有这样的默认参数这种机制,这一点需要注意

GO语言的可变参数列表

可变的参数,GO语言是支持的,如下

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

下面的numbers其实就被当成了一个int类型的参数数组,在传参的时候可以传任意数量的int类型参数。在下面我们可以对该参数数组使用范围for循环,来遍历可变的参数数组。

GO语言函数传参只有值传递

相比于C++提出的引用的概念,很多函数传参就使用了引用传递这样的概念,即使是不想改变原来的对象,也使用了 const的引用传递。

但是GO不同,GO没有引用传递这样的概念。GO有指针,所以GO就像C那样,通过指针来实现引用传递(其实本质是值传递,只不过传递的不是变量本身,而是变量的地址) 。

这部分内容在下一章,GO语言中的指针中会讲到。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值