## 一、函数定义
Go 语言函数定义格式如下:
~~~
func function_name( [parameter list] ) [return_types] {
函数体
}
~~~
函数定义解析:
* func:函数由 func 开始声明
* function\_name:函数名称,参数列表和返回值类型构成了函数签名。
* parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。
* return\_types:返回类型,函数返回一列值。return\_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return\_types 不是必须的。
* 函数体:函数定义的代码集合。
### 1、实例
~~~
package main
import "fmt"
/* 函数返回两个数的最大值 */
func max(a, b int) int {
var results int
if a > b {
results = a
} else {
results = b
}
return results
}
/* 函数返回两个数的最小值 */
func min(a, b int) (results int) {
if a > b {
results = b
} else {
results = a
}
return
}
func main() {
var a, b int = 20, 10
max := max(a, b)
min := min(a, b)
fmt.Printf("最大值为:%d\n", max)
fmt.Printf("最小值为:%d", min)
}
~~~
执行结果:
最大值为:20
最小值为:10
### 2、返回多个参数
~~~
package main
import "fmt"
/* 函数返回两个数的最小值 */
func fun001(a, b int) (int, int) {
return a, b
}
func main() {
var a, b int = 20, 10
a1, b1 := fun001(a, b)
fmt.Println(a1)
fmt.Println(b1)
}
~~~
执行结果:
20
10
## 二、函数参数
~~~
package main
import "fmt"
func fun01(a int) {
a = 2
fmt.Println("fun01中传入的值为:", a)
}
func main() {
var a int = 1
fmt.Println("main中的值第一次打印:", a)
fun01(a)
fmt.Println("main中调用fun01后打印:", a)
}
~~~
打印结果:
main中的值第一次打印: 1
fun01中传入的值为: 2
main中调用fun01后打印: 1
## 三、闭包
~~~
package main
import "fmt"
func getSequence() func() int {
i := 0
return func() int {
i += 1
return i
}
}
func main() {
/* nextNumber 为一个函数,函数 i 为 0 */
nextNumber := getSequence()
/* 调用 nextNumber 函数,i 变量自增 1 并返回 */
fmt.Println(nextNumber())
fmt.Println(nextNumber())
fmt.Println(nextNumber())
/* 创建新的函数 nextNumber1,并查看结果 */
nextNumber1 := getSequence()
fmt.Println(nextNumber1())
fmt.Println(nextNumber1())
}
~~~
执行结果:
1
2
3
1
2