第 5 章 / 共 20 章
函数
多返回值、命名返回、变参、闭包
基本定义
package main
import "fmt"
func add(a, b int) int {
return a + b
}
func main() {
fmt.Println(add(2, 3))
}多返回值与命名返回
Go 鼓励多返回值,惯用 (result, error)。命名返回值可作为函数内的预声明变量,配合裸 return 使用。
package main
import (
"errors"
"fmt"
)
func divide(a, b float64) (q float64, err error) {
if b == 0 {
err = errors.New("divide by zero")
return
}
q = a / b
return
}
func main() {
fmt.Println(divide(10, 4))
fmt.Println(divide(1, 0))
}变参函数
package main
import "fmt"
func sum(nums ...int) int {
total := 0
for _, n := range nums {
total += n
}
return total
}
func main() {
fmt.Println(sum(1, 2, 3)) // 6
nums := []int{1, 2, 3}
fmt.Println(sum(nums...)) // 切片展开
}匿名函数与闭包
函数是一等公民,可赋值给变量、作为参数传递,并能捕获外部变量形成闭包。
package main
import "fmt"
func main() {
counter := func() func() int {
n := 0
return func() int {
n++
return n
}
}()
fmt.Println(counter(), counter(), counter()) // 1 2 3
}函数作为参数 / 返回值
package main
import "fmt"
func apply(nums []int, f func(int) int) []int {
out := make([]int, len(nums))
for i, n := range nums {
out[i] = f(n)
}
return out
}
func main() {
double := apply([]int{1, 2, 3}, func(x int) int { return x * 2 })
fmt.Println(double) // [2 4 6]
}