第九章:把函数当变量传递,匿名函数、闭包、panic/recover
func main() {
sum, sub := calc(5, 6, add)
fmt.Println(sum, sub)
}
// 把函数当变量的形式传递过去
func calc(x, y int, op func(int, int) (int, int)) (int, int) {
return op(x, y)
}
func add(x, y int) (int, int) {
return x + y, x - y
}
返回一个变量值 :
package main
import "fmt"
func main() {
sum := calc(5, 6, add)
fmt.Println(sum)
}
// 把函数当变量的形式传递过去
func calc(x, y int, op func(int, int) int) int {
return op(x, y)
}
func add(x, y int) int {
return x + y
}
内置函数介绍
内置函数 | 介绍 |
---|---|
close | 主要用来关闭channel |
len | 用来求长度,比如string、array、slice、map、channel |
new | 用来分配内存,主要用来分配值类型,比如int、struct。返回的是指针 |
make | 用来分配内存,主要用来分配引用类型,比如chan、map、slice |
append | 用来追加元素到数组、slice中 |
panic和recover | 用来做错误处理 |
panic/recover
Go语言中目前(Go1.12)是没有异常机制,但是使用panic/recover
模式来处理错误。 panic
可以在任何地方引发,但recover
只有在defer
调用的函数中有效。 首先来看一个例子:
func funcA() {
fmt.Println("func A")
}
func funcB() {
defer func() {
err := recover()
//如果程序出出现了panic错误,可以通过recover恢复过来
if err != nil {
fmt.Println("recover in B")
}
}() // 这里()是立即执行匿名函数
panic("panic in B")
}
func funcC() {
fmt.Println("func C")
}
func main() {
funcA()
funcB()
funcC()
}
注意:
recover()
必须搭配defer
使用。defer
一定要在可能引发panic
的语句之前定义。