函数构成代码执行的逻辑结构。在Go语言中,函数的基本组成为:关键字func、函数名、参数列表、返回值、函数体和返回语句。
函数定义
使用一个最简单的加法函数来进行详细说明:
1 2
| 1func Add(a int, b int) (ret int, err error) {
2 |
1 2
| 1 if a < 0 || b < 0 {
2 |
1 2
| 1 err = errors.New("Should be non-negative numbers!")
2 |
1 2
| 1 return a + b, nil // 支持多返回值
2 |
1 2
| 1 如果参数列表中若干个相邻的参数类型相同,比如上面例子中的a和b,则可以在参数列表中省略前面变量的类型声明,如下所示:
2 |
1 2
| 1func Add(a, b int)(ret int, err error){
2 |
1 2
| 1 如果返回值列表中多个返回值的类型相同,也可以用同样的方式合并。
2 |
如果一个函数只有一个返回值,也可以这么写:
1 2
| 1func Add(a, b int) int {
2 |
函数调用
函数调用非常简单,只要事先导入该函数所在的包,就可以直接按照如下方式调用函数:
1 2
| 1import "mymath"
2 |
1 2
| 1c := mymath.Add(1,2)
2 |
1 2
| 1 注意一点,小写字母开头的函数只在本包内可见,大写字母开头的函数才能被其他包使用。这个规则也适用于类型和变量的可见性。
2 |
不定参数
不定参数是指传入的参数个数为不定数量。为了做到这点,首先需要将函数定义为接受不定参数类型:
1 2
| 1func myfunc(args ...int) {
2 |
1 2
| 1 for _, arg := range args {
2 |
这段代码的意思是,函数myfunc()接受不定数量的参数,这些参数的类型全部是int,所以它可以用如下方式调用:
形如…type格式的类型只能作为函数的参数类型存在,并且必须是最后一个参数。
之前的例子中将不定参数类型约束为int,如果你希望传任意类型,可以指定类型为interface{}。下面是Go语言标准库中fmt.Printf()的函数原型:
1 2
| 1func Printf(format string, args ...interface{}) {
2 |
1 2
| 1func MyPrintf(args ...interface{}) {
2 |
1 2
| 1 for _, arg := range args {
2 |
1 2
| 1 switch arg.(type) {
2 |
1 2
| 1 fmt.Println(arg, "is an int value.")
2 |
1 2
| 1 fmt.Println(arg, "is a string value.")
2 |
1 2
| 1 fmt.Println(arg, "is an int64 value.")
2 |
1 2
| 1 fmt.Println(arg, "is an unknown type.")
2 |
1 2
| 1 var v3 string = "hello"
2 |
1 2
| 1 var v4 float32 = 1.234
2 |
1 2
| 1 MyPrintf(v1, v2, v3, v4)
2 |
多返回值
Go语言中支持多返回值函数。
如果调用方调用了一个具有多返回值的方法,但是却不想关心其中的某个返回值,可以简单地用一个下划线来跳过这个返回值。
匿名函数和闭包
匿名函数是指不需要定义函数名称的一种函数实现方式。