第 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("工作中")
}
输出顺序是“工作中、第二个、第一个”。
练习题
- 编写
greet(name string) string返回问候语。 - 编写
max(a, b int) int返回较大的整数。 - 编写一个函数,同时返回矩形的面积和周长。
- 编写安全除法函数,除数为零时返回失败状态。
- 编写可变参数函数计算平均值,没有参数时返回
0。 - 编写
isPrime(n int) bool判断质数。 - 分别用循环和递归实现阶乘。
- 编写接收函数参数的计算器。
示例代码位于 E:\Project\Golang-Start\chapter-02-functions\examples。