1、函数的形参列表可以是多个,返回值列表也可以是多个。
2、形参列表和返回值列表的数据类型可以是值类型和引用类型。
3、函数的命名遵循标识符命名规范,首字母不能是数字,首字母大写该函数可以被本包文件和其他包文件使用,类似public,首字母小写,只能被本包文件使用,类似private。
4、函数中的变量是局部的,函数外不生效。
5、基本数据类型和数组默认都是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值。
6、如果希望函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量。从效果上看类似引用。
7、Go函数不支持函数重载。
如下图所示,有两个函数名称都为test02,但两个函数的形参不同,在其他语言如C++中是支持这种写的,c++编译器会将这两个函数看做是不同的函数。而在go语言中,这种写法是错误的。
因为go语言中是支持可变参数的,而且还有空接口,完全可以达到"函数重载"的效果。
8、在Go语言中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了。通过该变量也可以对函数进行调用。
示例如下:
输出为:
可以发现a的类型和函数getSum的类型是一样的,都是函数类型func<int, int> int,而且用a就可进行函数的调用。
9、函数既然是一种数据类型,因此在Go中,函数可以作为形参,并且调用。
案例如下所示:
10、为了简化数据类型定义,Go支持自定义数据类型。
基本语法如下:
type 自定义数据类型名 数据类型 //相当于一个别名
类似C语言中的typedef的用法。
下面有两个用法案例:
实际例程如下:
输出如下:
但是要注意上面注释的那段话:
go中myInt和int虽然都是int类型,但是go认为myInt和int是两个类型。
测试如下:
我们会发现,将myInt类型的num1赋值给int类型的num2时报错了。
要解决这个问题,可以对num1进行显式类型转换,将myInt转换成int,如下所示:
这样就不会报错了。
11、Go语言支持对函数返回值命名。
如下例程。需要注意,编译器在调用getSumAndSub函数时,已经将sum和sub这两个返回值变量创建好了。
这里return也不需要用"return sum, sub"这种写法了,因为这是直接用返回值sum和sub进行运算的,跟返回顺序都没关系。
12、使用_标识符,忽略返回值。
例程如下:
cal函数有两个返回值sum和sub。
在main函数中调用时,若你只想要函数返回值其中的一个,只需要用一个变量res1来接收你想要的返回值,用"_"标识符来“接收”另一个返回值即可。
13、Go支持可变参数
说明如下:
题(2)的案例代码如下:
代码中标红处表示sum函数中的参数,有一个int型的变量n1,另有一个[]int型的切片args。
案例代码的输出为:
可以看出sum函数可以求出一到多个int元素的和。但是要注意,参数列表中固定的元素只能放在前面,可变形参(切片)只能放在最后。如果args没有放在末尾就会报错,如下所示: