函数是组织好的、可重复使用的代码块。Go 语言中函数用 func 关键字声明,函数是「一等公民」,可以像普通值一样被赋值和传递。
1. 函数定义
func 函数名(参数列表) (返回值列表) {
函数体
return 返回值
}
例如定义一个求和函数:
func sum(a int, b int) int {
return a + b
}
result := sum(1, 2)
fmt.Println(result) // 3
参数类型相同的相邻参数可以合并声明,func sum(a, b int) int 与上面的写法等价。
2. 多返回值
Go 语言的函数可以返回多个值,这是它与很多语言不同的地方。惯用法是把错误作为最后一个返回值:
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("除数不能为0")
}
return a / b, nil
}
result, err := divide(10, 2)
if err != nil {
fmt.Println("出错了:", err)
return
}
fmt.Println(result) // 5
3. 可变参数
参数名后跟 … 表示可变参数,函数内部把它当作切片处理:
func sumAll(nums ...int) int {
total := 0
for _, n := range nums {
total += n
}
return total
}
fmt.Println(sumAll(1, 2, 3)) // 6
fmt.Println(sumAll(1, 2, 3, 4)) // 10
// 已有切片时可以用 ... 展开
s := []int{5, 6}
fmt.Println(sumAll(s...)) // 11
可变参数必须是参数列表的最后一个。
4. 匿名函数与闭包
没有名字的函数叫匿名函数,可以在定义后立即执行,也可以赋值给变量:
// 定义后立即执行
func(x, y int) {
fmt.Println(x + y)
}(1, 2)
// 赋值给变量
add := func(x, y int) int {
return x + y
}
fmt.Println(add(3, 4)) // 7
匿名函数引用了外层函数的变量时,就形成了闭包。被引用的变量会一直存活到闭包不再被使用:
func counter() func() int {
count := 0
return func() int {
count++
return count
}
}
c := counter()
fmt.Println(c()) // 1
fmt.Println(c()) // 2
fmt.Println(c()) // 3
每次调用 counter() 都会产生一个独立的 count 变量,闭包把状态保存在了函数里。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END









暂无评论内容