Skip to main content

第 2 章:函数

本章目标​

  • 使用 func 定义和调用函数
  • 理解参数、返回值和多返回值
  • 使用可变参数接收不定数量的值
  • 把函数保存到变量中并作为参数传递
  • 理解局部变量作用域和 defer

基本函数​

func greet(name string) {
fmt.Println("你好," + name + "!")
}

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

func main() {
greet("小明")
result := add(12, 8)
fmt.Println(result)
}

函数声明的结构是:

func 函数名(参数列表) 返回值类型 {
函数体
}

Go 将类型写在参数名之后,例如 name string、age int。相邻参数类型相同时,可以写成 a, b int。

多返回值​

Go 函数可以返回多个值,常用于同时返回结果和状态:

func divide(a, b float64) (float64, bool) {
if b == 0 {
return 0, false
}
return a / b, true
}

result, ok := divide(10, 2)
if !ok {
fmt.Println("计算失败")
}

不需要某个返回值时,用空白标识符 _ 忽略它:

result, _ := divide(10, 2)

可变参数​

func sum(numbers ...int) int {
total := 0
for _, number := range numbers {
total += number
}
return total
}

sum(1, 2, 3)

函数内部的 numbers 实际上是 []int 切片。如果已有切片,需要使用 ... 展开:

values := []int{10, 20, 30}
sum(values...)

函数作为值​

函数可以保存到变量中,也可以作为参数传给另一个函数:

func calculate(a, b int, operation func(int, int) int) int {
return operation(a, b)
}

result := calculate(6, 4, func(a, b int) int {
return a * b
})

没有名字的函数称为匿名函数。

作用域和 defer​

函数内部声明的变量通常只能在函数内部使用。defer 会把函数调用推迟到当前函数返回前执行;多个 defer 按后进先出的顺序执行:

func work() {
defer fmt.Println("第二个")
defer fmt.Println("第一个")
fmt.Println("工作中")
}

输出顺序是“工作中、第二个、第一个”。

练习题​

  1. 编写 greet(name string) string 返回问候语。
  2. 编写 max(a, b int) int 返回较大的整数。
  3. 编写一个函数,同时返回矩形的面积和周长。
  4. 编写安全除法函数,除数为零时返回失败状态。
  5. 编写可变参数函数计算平均值,没有参数时返回 0。
  6. 编写 isPrime(n int) bool 判断质数。
  7. 分别用循环和递归实现阶乘。
  8. 编写接收函数参数的计算器。

示例代码位于 E:\Project\Golang-Start\chapter-02-functions\examples。